django - NOT NULL约束失败:blog_comment.posts_id
问题描述:
我试图将评论表单提交给相应的博客。当我这样做时,我收到错误“NOT NULL约束失败:blog_comment.posts_id”。django - NOT NULL约束失败:blog_comment.posts_id
views.py
def add_comment(request, slug):
post = get_object_or_404(Post, slug=slug)
if request.method == 'POST':
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = post
comment.save()
return redirect('blog:post_detail', slug=post.slug)
else:
form = CommentForm()
template = "blog/post/add_comment.html"
context = {'form': form}
return render(request, template, context)
forms.py
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('user', 'email', 'title', 'body',)
models.py
class Post(models.Model):
STATUS_CHOISES = (
('draft', 'Draft'),
('published', 'Published'),
)
category = models.ForeignKey(Category)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250, unique=True)
content = models.TextField()
seo_title = models.CharField(max_length=250)
seo_description = models.CharField(max_length=160)
author = models.ForeignKey(User, related_name='blog_posts', default=settings.AUTH_USER_MODEL)
published = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=9, choices=STATUS_CHOISES, default='draft')
def get_absolute_url(self):
return reverse('blog:post_detail', args=[self.slug])
def __str__(self):
return self.title
class Comment(models.Model):
posts = models.ForeignKey(Post, related_name="comments")
user = models.CharField(max_length=250)
email = models.EmailField()
title = models.CharField(max_length=250)
body = models.TextField()
created = models.DateTimeField(auto_now_add=True)
approved = models.BooleanField(default=False)
def approved(self):
self.approved = True
self.save()
def __str__(self):
return self.title
什么是错我的代码?
从我所了解的某处/某种程度上来说,评论并没有发送到正确的博客文章,因为如果我将我的表单设置为帖子栏并手动选择它,它就可以工作。但理想情况下,我希望它会自动发送到相应的博客。
答
在Comment
模型ForeignKey
Post
的型号被命名为posts
不是post
,因此你需要做的:
if form.is_valid():
comment = form.save(commit=False)
comment.posts = post
comment.save()
它更有意义,只是重命名ForeignKey的,并将其命名为post
:
class Comment(models.Model):
post = models.ForeignKey(Post, related_name="comments")
你是对的,我正在重新命名测试的东西,看看他们究竟做了什么(我正在跟随一个教程,我暂停试图了解将要发生的事情),我忘记重新命名了。如果没有你的帮助,我不会注意到它!非常感谢!!它现在有效:D – dmandres