简体   繁体   English

Django-Taggit从模型字段中保存标签

[英]Django-Taggit saving tags from a model field

I am building a post editor for my website. 我正在为我的网站建立一个帖子编辑器。 One of the fields I can edit is for tags. 我可以编辑的其中一个字段是标签。 However when I save the post everything updates correctly and no errors are thrown but any changes I made to the tags field are not saved. 但是,当我保存帖子时,所有更新都正确,并且没有抛出任何错误,但我对标签字段所做的任何更改都不会保存。

# 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

You're doing a lot of unnecessary work here. 你在这里做了很多不必要的工作。 You're not leveraging the power of the UpdateView . 您没有利用UpdateView This is all you should need. 这就是你应该需要的。 It will call form.save() and everything for you 它将为您调用form.save()和一切

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)

Edit: bonus points if you get rid of get_success_url and add a get_absolute_url method to the Post model. 编辑:如果你摆脱get_success_url并将一个get_absolute_url方法添加到Post模型,则可获得奖励积分。

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM