Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 保存ModelForm时,NOT NULL约束失败_Django_Modelform - Fatal编程技术网

Django 保存ModelForm时,NOT NULL约束失败

Django 保存ModelForm时,NOT NULL约束失败,django,modelform,Django,Modelform,我是Django的新手(1.9) 当我保存模型表单时,NOTNULL约束失败,我不明白为什么 我建议用户使用一个表单来发表评论,表单中包含的唯一字段是“文本”,我希望在验证之后和保存到数据库之前在我的视图中设置排除的字段 Models.py: class Commentaire(models.Model): text = RichTextField() pub_date = models.DateTimeField() author = models.ForeignKey

我是Django的新手(1.9)

当我保存模型表单时,NOTNULL约束失败,我不明白为什么

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

Models.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保存表单时,出现以下异常:

非空约束失败:blogengine\u commentaire.pub\u日期

我在“form\u valid”中为排除的字段(author、post、pub\u date)设置的值没有考虑在内,它们似乎保持为空

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


谢谢

您需要像这样重写
表单\u有效的
方法

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
实例,然后需要填充并保存该实例。

您在PostDetail中做什么?这门课的目的是什么?嗨,我试着按照Django Doc的例子,构建一个CBV来管理DetailView和From:@Nizaleto如果你觉得它解决了你的问题,你可以接受答案,这样人们就会看到问题已经解决了。我是Django的新手,也许我开始使用CBV和Mixin时速度太快了,官方文件有点不完整。。。也许有一个最简单的方法,再次分享你的知识