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.
我是 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.