首页 > 解决方案 > 是什么导致 Django 中出现此错误:NOT NULL 约束失败:mainapp_comment.post_id

问题描述

我正在用 Django 制作社交网络 Web 应用程序。我已经确定了大部分所需的功能,但我坚持让评论系统正常工作。我最初拥有它是为了让用户可以为自己的评论命名,但我决定不这样做。

发帖系统有它,所以登录并发帖的用户,他们的名字将显示给帖子的作者。这就是为什么某些代码在 2 之间复制粘贴的原因。

我已经尝试过各种各样的事情,比如让视图成为一个类而不是一个函数。它没有用,我又回到了原点。现在用户可以发帖没有问题,但是没有记录用户名,我必须在管理界面中手动设置作者。

views.py 中的相关代码

class CreatePostView(LoginRequiredMixin,CreateView):
    login_url = '/login/'
    redirect_field_name = 'mainapp/post_details.html'
    form_class = PostForm
    model = Post
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

@login_required
def add_comment_to_post(request,pk):
    post = get_object_or_404(Post,pk=pk)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.save()
            return redirect('mainapp:post_detail',pk=post.pk)
            def form_valid(self, form):
                form.instance.author = self.request.user
                return super().form_valid(form)
    else:
        form = CommentForm()
    return render(request,'mainapp/comment_form.html',{'form':form})

这是来自models.py的相关代码

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.CharField(max_length=150)
    profile_pic = models.ImageField(upload_to='profile_pics',blank=True)
    verified = models.BooleanField(default=False)
    def __str__(self):
        return self.user.username

class Post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=75)
    text = models.TextField(max_length=250)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True,null=True,auto_now_add=True)
    tags = TaggableManager()

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def approve_comments(self):
        return self.comments.filter(approved_comment=True)

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

    def __str__(self):
        return self.title

class Comment(models.Model):
    post = models.ForeignKey('mainapp.Post',related_name='comments',on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    approved_comment = models.BooleanField(default=True)

    def approve(self):
        self.approved_comment = True
        self.save()

    def get_absolute_url(self):
        return reverse('post_list')

    def __str__(self):
        return self.text

这是 forms.py 文件,带有 CommentForm 类

class CommentForm(forms.ModelForm):
    class Meta():
        model = Comment
        fields = ('text',)
        widgets = {
            'text':forms.Textarea(attrs={'class':'textareaclass'}),
        }

这是 views.py 中的一点,它使我所说的 Post 系统工作正常

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

如果这个问题很长,我很抱歉,但提前谢谢你:)

目前,我只是对为什么这不起作用感到困惑。它适用于帖子系统,但我无法真正弄清楚这个评论系统。谢谢 :)

标签: pythondjangodjango-modelsdjango-views

解决方案


我对您的帖子的标题有些困惑-我不确定为什么您post_id在设置时会遇到非空约束失败comment.post-但以下内容应该可以将当前用户附加为评论:

@login_required
def add_comment_to_post(request,pk):
    post = get_object_or_404(Post,pk=pk)
    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            comment.post = post
            comment.author = request.user # add this line
            comment.save()
            return redirect('mainapp:post_detail',pk=post.pk)
            # remove `def form_valid`
    else:
        form = CommentForm()
    return render(request,'mainapp/comment_form.html',{'form':form})

请注意删除了form_valid内联函数定义,该定义仅作为基于类的视图上下文中的方法才有意义。


推荐阅读