【问题标题】:NOT NULL constraint failed when save ModelForm保存 ModelForm 时 NOT NULL 约束失败
【发布时间】:2016-06-16 13:30:55
【问题描述】:

我是 Django (1.9) 的新手

当我保存我的 ModelForm 时,我有一个 NOT NULL 约束失败,我不明白为什么......

我向用户建议一个表单来发表评论,并且表单中包含的唯一字段是“文本”,我想在验证之后和保存到数据库之前在我的视图中设置排除的字段

模型.py:

class Commentaire(models.Model):
    text = RichTextField()
    pub_date = models.DateTimeField()
    author = models.ForeignKey(User)
    post = models.ForeignKey(Post)
    publish = models.BooleanField()

    def __str__(self):
        return "/%s/%s" % (self.pub_date,self.author.username)

    class Meta:
        ordering = ["-pub_date"]

Forms.py:

class CommentaireForm(forms.ModelForm):
    class Meta:
        model = Commentaire
        fields = ['text']

Views.py:

class PostDetail(View):

    def get(self, request, *args, **kwargs):
        view = PostDisplay.as_view()
        return view(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        view = PostComment.as_view()
        return view(request, *args, **kwargs)

class PostDisplay(DetailView):
    model = Post

    def get_context_data(self, **kwargs):
        context = super(PostDisplay, self).get_context_data(**kwargs)

        context['form'] = CommentaireForm()
        return context

class PostComment(SingleObjectMixin, FormView):
    template_name = 'blogengine/post_detail.html'
    form_class = CommentaireForm
    model = Post

    def post(self, request, *args, **kwargs):
        #if not request.user.is_authenticated():
        #    return HttpResponseForbidden()

        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):
        """
        If the form is valid, redirect to the supplied URL
        """
        form.save(commit=False)
        form.post = self.object
        form.author = self.request.user
        form.pub_date = datetime.now()
        form.publish = True
        form.save()

        return HttpResponseRedirect(self.get_success_url())

当 Django 保存表单时,我有这个异常:

NOT NULL 约束失败:blogengine_commentaire.pub_date

我在“form_valid”中为排除字段(作者、帖子、pub_date)设置的值没有被考虑在内,它们似乎保持为空

你能解释一下为什么因为我迷路了吗?

谢谢

【问题讨论】:

标签: django modelform


【解决方案1】:

你需要像这样重写form_valid方法

def form_valid(self, form):
    """
    If the form is valid, redirect to the supplied URL
    """
    model_instance = form.save(commit=False)
    model_instance.post = self.object
    model_instance.author = self.request.user
    model_instance.pub_date = datetime.now()
    model_instance.publish = True
    model_instance.save()
    return HttpResponseRedirect(self.get_success_url())

因为save(commit=False) 将返回一个Post 实例,然后您需要填充并保存该实例。

【讨论】:

  • @Nizaleto 如果你觉得它解决了你的问题,你可以接受答案,这样人们就会看到问题已经解决了。
  • 我是 Django 的新手,也许我开始使用 CBV 和 Mixins 太快了,而且官方文档有点不完整......也许有一个最简单的方法,再次坦克来分享你的知识
猜你喜欢
  • 2015-04-22
  • 1970-01-01
  • 2018-08-24
  • 2022-01-19
  • 2021-11-16
  • 2020-12-18
  • 2021-03-20
  • 2020-02-11
  • 2019-02-13
相关资源
最近更新 更多