Django,IntegrityError,NOT NULL 约束失败:ask_response.postinfo_id

Django, IntegrityError, NOT NULL constraint failed: ask_response.postinfo_id

我是 Django 的新手,我一直在关注一些 YouTube 教程以了解它的概念。 我正在创建的网站是 blog/forum。 现在我来到了必须为用户的 post 实现评论的部分,我为响应创建了模型,并将其与实际的 post 绑定。 当我从管理页面为特定的 post 添加 response/comment 时,一切正常,但是当我尝试从模板表单添加新的 response/comment 时,它给我这样的错误: /question-1 处的 IntegrityError NOT NULL 约束失败:ask_response.postinfo_id

我想肯定是表单不工作的原因,但我不明白是什么。

这里是 models.py:

class PostInfo(models.Model):
      title = models.CharField(max_length=70)
      content = models.TextField(max_length=5000)
      date_posted = models.DateTimeField(default=timezone.now)
      author = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
      likes = models.ManyToManyField(User, related_name="blog_posts")
      views = models.IntegerField(default=0)

class Response(models.Model):
      user = models.ForeignKey(User, on_delete=models.CASCADE)
      postinfo = models.ForeignKey(PostInfo, on_delete=models.CASCADE, related_name="responses")
      body = models.TextField()
      date_published = models.DateTimeField(default=timezone.now)

Views.py:

def detailed_view(request, pk):
     post = get_object_or_404(PostInfo.objects.filter(id=pk))
     comments = post.responses.all()
     new_comment = None

     if request.method == 'POST':
         comment_form = ResponseForm(data=request.POST)
         if comment_form.is_valid():
             new_comment = comment_form.save(commit=False)
             new_comment.post = post
             new_comment.save()
     else:
         comment_form = ResponseForm()

     return render(request, 'homepage/post_detailed_view.html', {'post': post,
                                                            'comments': comments,
                                                            'new_comment': new_comment,
                                                            'comment_form': comment_form})

这是模板中的表格:

<div class="col-md-8 card mb-4  mt-3 ">
    <div class="card-body">
        {% if new_comment %}
        <div class="alert alert-success" role="alert">
            Your comment is awaiting moderation
        </div>
        {% else %}
        <h3>Leave a comment</h3>
        <form method="post" style="margin-top: 1.3em;">
            {{ comment_form.as_p }}
            {% csrf_token %}
            <button type="submit" class="btn btn-primary  btn-lg"">Submit</button>
        </form>
        {% endif %}
    </div>
</div>

非常感谢您的提前帮助。

您需要设置 .post_info 字段,而不是 .post,因为 Response 模型中没有定义这样的字段:

def detailed_view(request, pk):
    post = get_object_or_404(PostInfo, id=pk)
    comments = post.responses.all()
    new_comment = None
    if request.method == 'POST':
        comment_form = ResponseForm(data=request.POST)
            if comment_form.is_valid():
                form<strong>.instance.post_info = post</strong>
                form<strong>.instance.user = request.user</strong>
                form.save()
                return redirect('<em>name-of-some-view</em>')
    else:
         comment_form = ResponseForm()
    context = {'post': post,
               'comments': comments,
               'new_comment': new_comment
               'comment_form': comment_form
    }
    return render(request, 'homepage/post_detailed_view.html', context)

Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.