首页 > 解决方案 > django中form_valid的问题

问题描述

在此处输入图像描述我在 Django 中使用带有 Detail View 和 FormMixin 的 CBV 以及函数 form_valid 来列出帖子和创建评论。但是当我尝试创建评论时,我得到了图片中的错误。我还希望用户只能以他的名字创建评论,但是当我尝试创建评论时,我会得到一个我可以选择的所有作者的列表。

这是我的看法

class PostDetail(FormMixin,generic.DetailView):
    model = PostModel
    template_name = 'post_detail.html'
    form_class=CommentForm
    fields=['comment']

    def get_success_url(self):
        return reverse('post_detail',kwargs={'slug':self.object.slug})

    def get_context_data(self, **kwargs):
        context = super(PostDetail,self).get_context_data(**kwargs)
        context ['commentmodel_list'] = CommentModel.objects.filter(post=self.object).order_by('-created_on')
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)


    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.post=self.model.post
        self.object.save()
        return super(PostDetail,self).form_valid(form)

这是我的模型

class PostModel(models.Model):
    post = models.TextField(max_length=256, unique=True)
    slug = models.SlugField(max_length=20, unique=True)
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='post_author')
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_on']

    def save(self, *args, **kwargs):
        self.slug = self.slug or slugify(self.post)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.post


class CommentModel(models.Model):
    post = models.ForeignKey('dictionary.PostModel', on_delete=models.CASCADE, related_name='post_comment')
    comment=models.TextField(max_length=256,unique=True)
    author = models.ForeignKey(User, on_delete= models.CASCADE,related_name='comment_author')
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_on']


    def get_absolute_url(self):
        return reverse("comment_detail",kwargs={'pk':self.pk})


    def __str__(self):
        return self.comment

标签: pythonhtmldjango

解决方案


同时使用 aform_classfields没有意义,因为fields它们仅用于使用ModelForm[ modelform_factoryDjango-doc]创建 a 。如果您因此指定 a form_class,则form_class不应列出不必要的字段:

class CommentForm(forms.ModelForm):
    class Meta:
        model = CommentModel
        fields = ['comment']

此外,我建议在这里使用ModelFormMixin[Django-doc],因为这将删除更多样板代码。由于您的表单包装了一个Comment对象,因此您不能将它包装的对象设置为self.object,因为那是一个PostModel对象。您可以将 设置self.objectPostModel您评论的位置,然后更新包装在 中的.authorand :.post.instanceform

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import ModelFormMixin

class PostDetail(LoginRequiredMixin, ModelFormMixin, generic.DetailView):
    model = PostModel
    template_name = 'post_detail.html'
    form_class = CommentForm

    def get_success_url(self):
        return reverse('post_detail',kwargs={'slug':self.object.slug})

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context ['commentmodel_list'] = CommentModel.objects.filter(post=self.object).order_by('-created_on')
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)


    def form_valid(self, form):
        form.instance.author = self.request.user
        form.instance.post = self.object
        return super().form_valid(form)

您可能希望str(…)在定义__str__模型对象时调用:

class PostModel(models.Model):
    # …

    def __str__(self):
        return str(self.post)


class CommentModel(models.Model):
    # …

    def __str__(self):
        return str(self.comment)

注意:型号通常没有Model后缀。因此,最好重命名PostModelPost.


注意:您可以使用LoginRequiredMixinmixin [Django-doc]将视图限制为对经过身份验证的用户的基于类的视图 。


推荐阅读