简而言之:
我创建了一个帖子模型和评论模型,并创建了一个评论表单,我正在提供一个 url,该 url 将显示所有帖子、相关评论和评论表单以输入新评论。提交页面会重新加载新评论。但是当我提交评论时,我收到错误:
django.db.utils.IntegrityError: NOT NULL constraint failed: book_comment.related_post_id
这是一个看起来很有希望的答案,但我无能为力。我认为它没有获得父帖子 ID。
长版本:
这是我的模型文件:
def user_image_path(instance, filename):
return f"profile/user_{random.randint(1,1000)}_{filename}"
class Post(models.Model):
post_title = models.CharField(max_length=250)
post_creator = models.CharField(max_length=150)
creator_pic = models.ImageField(upload_to=user_image_path)
post_body = models.TextField()
post_created = models.DateTimeField(auto_now_add=True)
post_updated = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.post_title} **{self.post_creator}**"
class Comment(models.Model):
related_post = models.ForeignKey(Post, related_name="comments")
comment_creator = models.CharField(max_length=150)
comment_body = models.CharField(max_length=1024)
comment_created = models.DateTimeField(auto_now_add=True)
comment_updated = models.DateTimeField(auto_now=True)
def __str__(self):
return f"{self.comment_creator}"
这是我的表格:
from django import forms
from .models import Post, Comment
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ['comment_creator', 'comment_body']
这是视图:
from django.shortcuts import render, HttpResponseRedirect,reverse
from .models import Comment, Post
from .forms import CommentForm
# Create your views here.
def servePage(request):
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
form.save()
HttpResponseRedirect(reverse('serve'))
else:
form = CommentForm()
posts = Post.objects.all()
return render(request, 'book/showpost.html', {'posts': posts, 'form': form})
这是我的 html 模板:
{% extends 'book/base.html' %}
{% block content %}
<h1>Welcome to book of life</h1>
<h2>New posts</h2>
<ul>
{% for post in posts %}
<li>{{ post.post_title }} by <small>{{ post.post_creator }}</small></li>
<p>{{ post.post_created|timesince }}</p>
<p>Content: <span>{{ post.post_body }}</span></p>
{# <br>#}
<h3>Comments:</h3>
{% for comment in post.comments.all %}
<p>{{ comment.comment_creator }} => {{ comment.comment_body }}</p>
{% endfor %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" name="comment">
</form>
<br><br>
{% endfor %}
</ul>
{% endblock %}
对不起,任何错误。提前谢谢。
发生此错误是因为您尝试在注释模型中创建一个新记录,该记录将related_post字段留空,而不应该这样做。如果您愿意将此字段留空,则可以在 models.py 中将该字段更改为以下内容:
related_post = models.ForeignKey(Post, related_name="comments", null=True)
或者,您可能不希望它为空。如果您向表单中的字段添加related_post,则会创建一个包含所有帖子的下拉框,您可以选择其中一个进行评论。
您也可以自动检测您正在评论的帖子,但我不确定这是如何完成的。
多亏了@cbuch1800我终于得到了答案。这是它和对文件的更改:
在 { {form.as_p}}
之后的模板文件中,我添加了一行来传递当前帖子 主键 (id( 查看。
模板文件:
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="hidden" name="post_pk" value={{ post.pk }}>
<input type="submit" name="comment">
</form>
在视图中文件检索帖子对象并将帖子对象添加到相关注释中。
视图:
def servePage(request):
if request.method == 'POST':
form = CommentForm(request.POST)
post = Post.objects.get(pk=request.POST['post_pk'])
if form.is_valid():
comment = form.save(commit=False)
comment.related_post = post
## related_post from Comment model
comment.save()
HttpResponseRedirect(reverse('serve'))
else:
form = CommentForm()
posts = Post.objects.all()
return render(request, 'book/showpost.html', {'posts': posts, 'form': form})