初めての投稿で至らない点があれば申し訳ありません。
ただいま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)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/23 07:38