質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

4099閲覧

python,Djangoのviews.pyの関数処理をクラス(baseClass)に変換したいです。

yuki1010

総合スコア43

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2016/07/22 16:03

初めての投稿で至らない点があれば申し訳ありません。
ただいまPythonのDjangoを勉強中です。
views.pyでの関数からBaseClassに変更しようとして悪戦苦闘しております。次のコードは関数処理になっております。どうしたらそれらをBaseClassに変換できるかご教授よろしくお願いします。
特に分からない部分は、formを使う際、添付ファイルをどう扱えばいいのかです。大変長々しく書いてしまい申し訳ありません。

python

1# views.py 2try: 3 from urllib import quote_plus #python 2 4except: 5 pass 6 7from django.contrib import messages 8from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 9from django.db.models import Q 10from django.http import HttpResponse, HttpResponseRedirect, Http404 11from django.shortcuts import render, get_object_or_404, redirect 12from django.utils import timezone 13 14from .forms import PostForm 15from .models import Post 16 17""" 18post_create()をDjangoのCreateViewに変換したいです。 19post_detail()をDjangoのDetailViewに変換したいです。 20post_update()をDjangoのUpdateViewに変換したいです。 21post_list()をDjangoのListViewに変換したいです。 22post_delete()をDjangoのDeleteViewに変換したいです。 23""" 24 25def post_create(request): 26 if not request.user.is_staff or not request.user.is_superuser: 27 raise Http404 28 29 form = PostForm(request.POST or None, request.FILES or None) 30 if form.is_valid(): 31 instance = form.save(commit=False) 32 instance.user = request.user 33 instance.save() 34 # message success 35 messages.success(request, "Successfully Created") 36 return HttpResponseRedirect(instance.get_absolute_url()) 37 context = { 38 "form": form, 39 } 40 return render(request, "post_form.html", context) 41 42def post_detail(request, slug=None): 43 instance = get_object_or_404(Post, slug=slug) 44 if instance.publish > timezone.now().date() or instance.draft: 45 if not request.user.is_staff or not request.user.is_superuser: 46 raise Http404 47 share_string = quote_plus(instance.content) 48 context = { 49 "title": instance.title, 50 "instance": instance, 51 "share_string": share_string, 52 } 53 return render(request, "post_detail.html", context) 54 55def post_list(request): 56 today = timezone.now().date() 57 queryset_list = Post.objects.active() 58 if request.user.is_staff or request.user.is_superuser: 59 queryset_list = Post.objects.all() 60 61 query = request.GET.get("q") 62 if query: 63 queryset_list = queryset_list.filter( 64 Q(title__icontains=query)| 65 Q(content__icontains=query)| 66 Q(user__first_name__icontains=query) | 67 Q(user__last_name__icontains=query) 68 ).distinct() 69 paginator = Paginator(queryset_list, 8) # Show 25 contacts per page 70 page_request_var = "page" 71 page = request.GET.get(page_request_var) 72 try: 73 queryset = paginator.page(page) 74 except PageNotAnInteger: 75 # If page is not an integer, deliver first page. 76 queryset = paginator.page(1) 77 except EmptyPage: 78 # If page is out of range (e.g. 9999), deliver last page of results. 79 queryset = paginator.page(paginator.num_pages) 80 81 82 context = { 83 "object_list": queryset, 84 "title": "List", 85 "page_request_var": page_request_var, 86 "today": today, 87 } 88 return render(request, "post_list.html", context) 89 90 91def post_update(request, slug=None): 92 if not request.user.is_staff or not request.user.is_superuser: 93 raise Http404 94 instance = get_object_or_404(Post, slug=slug) 95 form = PostForm(request.POST or None, request.FILES or None, instance=instance) 96 if form.is_valid(): 97 instance = form.save(commit=False) 98 instance.save() 99 messages.success(request, "<a href='#'>Item</a> Saved", extra_tags='html_safe') 100 return HttpResponseRedirect(instance.get_absolute_url()) 101 102 context = { 103 "title": instance.title, 104 "instance": instance, 105 "form":form, 106 } 107 return render(request, "post_form.html", context) 108 109def post_delete(request, slug=None): 110 if not request.user.is_staff or not request.user.is_superuser: 111 raise Http404 112 instance = get_object_or_404(Post, slug=slug) 113 instance.delete() 114 messages.success(request, "Successfully deleted") 115 return redirect("posts:list") 116

python

1# urls.py 2# 上の階層にはプロジェクトのurls.pyがあり namespace='posts'にしてあります。 3from django.conf.urls import url 4 5from .views import ( 6 post_list, 7 post_create, 8 post_detail, 9 post_update, 10 post_delete, 11 ) 12 13urlpatterns = [ 14 url(r'^$', post_list, name='list'), 15 url(r'^create/$', post_create, name='create'), 16 url(r'^(?P<slug>[\w-]+)/$', post_detail, name='detail'), 17 url(r'^(?P<slug>[\w-]+)/edit/$', post_update, name='update'), 18 url(r'^(?P<slug>[\w-]+)/delete/$', post_delete), 19] 20

python

1# models.py 2from __future__ import unicode_literals 3 4from django.conf import settings 5from django.core.urlresolvers import reverse 6from django.db import models 7from django.db.models.signals import pre_save 8from django.utils import timezone 9 10from django.utils.text import slugify 11# Create your models here. 12 13class PostManager(models.Manager): 14 def active(self, *args, **kwargs): 15 return super(PostManager, self).filter(draft=False).filter(publish__lte=timezone.now()) 16 17def upload_location(instance, filename): 18 #filebase, extension = filename.split(".") 19 #return "%s/%s.%s" %(instance.id, instance.id, extension) 20 PostModel = instance.__class__ 21 new_id = PostModel.objects.order_by("id").last().id + 1 22 """ 23 instance.__class__ gets the model Post. We must use this method because the model is defined below. 24 Then create a queryset ordered by the "id"s of each object, 25 Then we get the last object in the queryset with `.last()` 26 Which will give us the most recently created Model instance 27 We add 1 to it, so we get what should be the same id as the the post we are creating. 28 """ 29 return "%s/%s" %(new_id, filename) 30 31class Post(models.Model): 32 user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 33 title = models.CharField(max_length=120) 34 slug = models.SlugField(unique=True) 35 image = models.ImageField(upload_to=upload_location, 36 null=True, 37 blank=True, 38 width_field="width_field", 39 height_field="height_field") 40 height_field = models.IntegerField(default=0) 41 width_field = models.IntegerField(default=0) 42 content = models.TextField() 43 draft = models.BooleanField(default=False) 44 publish = models.DateField(auto_now=False, auto_now_add=False) 45 updated = models.DateTimeField(auto_now=True, auto_now_add=False) 46 timestamp = models.DateTimeField(auto_now=False, auto_now_add=True) 47 48 objects = PostManager() 49 50 def __unicode__(self): 51 return self.title 52 53 def __str__(self): 54 return self.title 55 56 def get_absolute_url(self): 57 return reverse("posts:detail", kwargs={"slug": self.slug}) 58 59 class Meta: 60 ordering = ["-timestamp", "-updated"] 61 62def create_slug(instance, new_slug=None): 63 slug = slugify(instance.title) 64 if new_slug is not None: 65 slug = new_slug 66 qs = Post.objects.filter(slug=slug).order_by("-id") 67 exists = qs.exists() 68 if exists: 69 new_slug = "%s-%s" %(slug, qs.first().id) 70 return create_slug(instance, new_slug=new_slug) 71 return slug 72 73def pre_save_post_receiver(sender, instance, *args, **kwargs): 74 if not instance.slug: 75 instance.slug = create_slug(instance) 76 77pre_save.connect(pre_save_post_receiver, sender=Post)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Djangoあまり詳しくないので外していたらすみません。

BaseClassではなく、Class-Based Viewsのことを言っているんですよね?

これの情報を検索するには、キーワード"django class based view"で、日本語に限定しないでググってみて下さい。
基本的な情報は日本語でも見つかりますが、あまり多くないようです。

Djangoにおけるクラスベース汎用ビューの入門と使い方サンプル - Qiita
http://qiita.com/felyce/items/7d0187485cad4418c073

Class-based views | Django documentation | Django
https://docs.djangoproject.com/ja/1.9/topics/class-based-views/

ファイルアップロードについては、この辺ですかねー。

Upload files using FileField and Generic Class-based Views in Django 1.5 « Kelvin's Codeways
http://www.kelvinwong.ca/2013/09/19/upload-files-using-filefield-and-generic-class-based-views-in-django-1-5/


それと、これをいきなり改造するのではなく、
いったん練習用のプロジェクトを作ってそちらで練習してから
このアプリの修正に取りかかった方が良いかもしれませんね。

投稿2016/07/23 04:43

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuki1010

2016/07/23 07:38

大変参考になりました。ありがとうございます。(^^)
guest

0

自己解決

ご回答してくださった方ありがとうございます。参考にして調べながら変換コードを作成することできました(汗)
これで動作が出来たのですが、なにかこうした方がいいなどの、ご指摘があれば参考にさせてください。

python

1# views.py 2 3# -*- coding: utf-8 -*- 4try: 5 from urllib import quote_plus 6except: 7 pass 8 9try: 10 # for python 3 11 from urllib.parse import quote_plus 12except: 13 pass 14 15from django.views.generic.edit import CreateView, UpdateView 16from django.views.generic.detail import DetailView 17from django.views.generic.list import ListView 18from django.contrib.messages.views import SuccessMessageMixin 19 20 21from django.contrib import messages 22from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 23from django.db.models import Q 24from django.http import Http404 25from django.shortcuts import get_object_or_404, redirect 26from django.utils import timezone 27 28from .forms import PostForm 29from .models import Post 30 31from django.contrib.admin.views.decorators import user_passes_test 32from django.utils.decorators import method_decorator 33 34 35class SuperStaffLoginMixin(object): 36 37 @method_decorator(user_passes_test(lambda u: u.is_staff or u.is_superuser)) 38 def dispatch(self, request, *args, **kwargs): 39 return super(SuperStaffLoginMixin, self).dispatch( 40 request, *args, **kwargs) 41 42 43class PostCreateView(SuccessMessageMixin, SuperStaffLoginMixin, CreateView): 44 form_class = PostForm 45 template_name = 'post_form.html' 46 success_message = '%(title)s is Successfully Created!' 47 48 49class PostDetailView(SuperStaffLoginMixin, DetailView): 50 model = Post 51 template_name = 'post_detail.html' 52 53 def get_context_data(self, *args, **kwargs): 54 instance = self.get_object() 55 share_string = quote_plus(instance.content) 56 context = super(PostDetailView, self).get_context_data(*args, **kwargs) 57 context['share_string'] = share_string 58 return context 59 60 61class PostListView(ListView): 62 template_name = 'post_list.html' 63 page_request_var = None 64 65 def get_queryset(self, *args, **kwargs): 66 if self.request.user.is_staff or self.request.user.is_superuser: 67 queryset_list = Post.objects.all() 68 else: 69 queryset_list = Post.objects.active() 70 query = self.request.GET.get("q") 71 if query: 72 queryset_list = queryset_list.filter( 73 Q(title__icontains=query) | 74 Q(content__icontains=query) | 75 Q(user__first_name__icontains=query) | 76 Q(user__last_name__icontains=query)).distinct() 77 paginator = Paginator(queryset_list, 4) 78 page_request_var = "page" 79 page = self.request.GET.get(page_request_var) 80 81 try: 82 queryset = paginator.page(page) 83 except PageNotAnInteger: 84 # If page is not an integer, deliver first page. 85 queryset = paginator.page(1) 86 except EmptyPage: 87 # If page is out of range (e.g. 9999), 88 # deliver last page of results. 89 queryset = paginator.page(paginator.num_pages) 90 91 self.page_request_var = page_request_var 92 return queryset 93 94 def get_context_data(self, *args, **kwargs): 95 context = super(PostListView, self).get_context_data(*args, **kwargs) 96 context['today'] = timezone.now().date() 97 context['page_request_var'] = self.page_request_var 98 context['title'] = 'List' 99 context['object_list'] = self.get_queryset 100 return context 101 102 103class PostUpdateView(SuccessMessageMixin, SuperStaffLoginMixin, UpdateView): 104 model = Post 105 form_class = PostForm 106 template_name = 'post_form.html' 107 success_message = "%(title)s Saved" 108 109 def get_context_data(self, *args, **kwargs): 110 context = super(PostUpdateView, self).get_context_data(*args, **kwargs) 111 context['title'] = self.get_object().title 112 context['instance'] = self.get_object() 113 return context 114 115 116def post_delete(request, slug=None): 117 if not request.user.is_staff or not request.user.is_superuser: 118 raise Http404 119 instance = get_object_or_404(Post, slug=slug) 120 instance.delete() 121 messages.success(request, "Successfully deleted") 122 return redirect("posts:list")

投稿2016/07/23 07:41

編集2016/07/23 07:43
yuki1010

総合スコア43

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問