2017-05-31 7 views
1

私のウェブサイト用のポストエディタを構築しています。私が編集できるフィールドの1つはタグ用です。しかし、投稿をすべて保存すると、すべてが正しく更新され、エラーはスローされませんが、タグフィールドに行った変更は保存されません。モデルフィールドからDjango-Taggitタグを保存する

# Views.py 
class EditPostView(UpdateView): 
    form_class = EditPostForm 
    model = Post 
    template_name = 'myapp/editpost.html' 

    def get(self, request, pk): 

     if (not request.user.is_superuser): 
      return HttpResponseForbidden() 

     post = Post.objects.get(id=pk) 
     if (post is None): 
      return HttpResponseNotFound() 

     form = self.form_class(instance=post) 

     return render(request, self.template_name, {'form': form, 'post': post}) 

    def post(self, request, pk): 

     if (not request.user.is_superuser): 
      return HttpResponseForbidden() 

     post = Post.objects.get(id=pk) 
     if (post is None): 
      return HttpResponseNotFound() 

     form = self.form_class(request.POST, instance=post) 

     if (form.is_valid()): 
      post.title = form.cleaned_data['title'] 
      post.content_type = form.cleaned_data['content_type'] 
      post.screenshot = form.cleaned_data['screenshot'] 
      post.tags = form.cleaned_data['tags'] 
      post.body = form.cleaned_data['body'] 
      post.nsfw = form.cleaned_data['nsfw'] 
      post.allow_comments = form.cleaned_data['allow_comments'] 
      post.display_edited = form.cleaned_data['display_edited'] 
      post.files = form.cleaned_data['files'] 

      post.date_edited = datetime.now() 

      post.save() 

      return redirect('/posts/' + str(post.id)) 
     else: 
      return HttpResponseNotFound() 

     return HttpResponseNotFound() 

#Forms.py 
class PostForm(forms.ModelForm): 
    class Meta: 
     model = Post 
     fields = ['title', 'content_type', 'screenshot', 'body', 'tags', 'nsfw', 'allow_comments', 'files'] 
     widgets = { 
      'screenshot': forms.TextInput(attrs={'placeholder': 'URL...'}), 
      'tags': TagWidget(), 
     } 
     labels = { 
      'files': 'Attachments', 
     } 

# Models.py 
class Post(models.Model): 
    title = models.CharField(max_length=256) 
    disclaimer = models.CharField(max_length=256, blank=True) 
    BLOGS = 'blogs' 
    APPLICATIONS = 'applications' 
    GAMES = 'games' 
    WEBSITES = 'websites' 
    GALLERY = 'gallery' 
    PRIMARY_CHOICES = (
     (BLOGS, 'Blogs'), 
     (APPLICATIONS, 'Applications'), 
     (GAMES, 'Games'), 
     (WEBSITES, 'Websites'), 
    ) 
    content_type = models.CharField(max_length=256, choices=PRIMARY_CHOICES, default=BLOGS) 
    screenshot = models.CharField(max_length=256, blank=True) 
    tags = TaggableManager() 
    body = RichTextField() 
    date_posted = models.DateTimeField(default=datetime.now) 
    date_edited = models.DateTimeField(blank=True, null=True) 
    visible = models.BooleanField(default=True) 
    nsfw = models.BooleanField() 
    display_edited = models.BooleanField(default=False) 
    allow_comments = models.BooleanField(default=True) 
    files = models.ManyToManyField(File, blank=True) 

    def __str__(self): 
     if (self.visible == False): 
      return '(Hidden) ' + self.title + ' in ' + self.content_type 
     return self.title + ' in ' + self.content_type 
+0

各フィールドをリストする代わりに、 'post = form.save()'を実行してみてください。 – Brobin

答えて

0

ここでは多くの不必要な作業を行っています。あなたはUpdateViewの力を活用していません。これはあなたが必要とするものです。あなたはget_success_urlを取り除く場合はボーナスポイントとPostモデルにget_absolute_urlメソッドを追加します。それはあなた

from django.http import HttpResponseForbidden 
from django.shortcuts import get_object_or_404 
from django.views.generic.edit import UpdateView 

class EditPostView(UpdateView): 
    form_class = EditPostForm 
    model = Post 
    template_name = 'myapp/editpost.html' 

    def dispatch(self, *args, **kwargs): 
     if not self.request.user.is_superuser: 
      return HttpResponseForbidden() 
     return super(EditPostView, self).dispatch(*args, **kwargs) 

    def get_object(self, queryset=None): 
     return get_object_or_404(Post, id=self.kwargs['id']) 

    def get_success_url(self): 
     return '/posts/{0}'.format(self.object.id) 

編集のためform.save()、すべてを呼び出します。

class Post(models.Model): 
    ... 

    def save(self, *args, **kwargs): 
     self.date_edited = datetime.now() 
     super(Post, self).save(*args, **kwargs) 

    def get_absolute_url(self): 
     return '/posts/{0}'.format(self.id) 
+0

form.save()を呼び出してpost.date_edited = datetime.now()を保存するにはどうすればよいですか? – Anon

+0

今、私はそれを2回保存することで動作させることができます:post = form.save()、post.date_edited = datetime.now()、post.save() – Anon

+0

これをモデルに追加しました。あなたは自分のやり方でやることもできます。フォーム上でsaveを2回呼び出すときに行う通常の方法は、初めてこのようにする: 'post = form.save(commit = False)'です。これはデータベースに一度しかヒットしません。 – Brobin

関連する問題