如何基于Slug而非PK实现博客评论并修复非空约束报错
解决Django中用Slug关联评论与文章时的NOT NULL约束错误
问题场景
提交评论时触发错误:
IntegrityError at /blogpost-2/comment/
NOT NULL constraint failed: blog_comment.post_id
需求是通过Slug而非主键(PK)关联博客文章与评论,但未能正确将评论绑定到对应文章。
错误原因
- 路由
add_comment传递的是slug参数,但视图AddCommentView的form_valid方法中尝试获取不存在的self.kwargs['pk'],导致post_id未被赋值,违反数据库非空约束 - 后续尝试赋值
post_slug无效,因为Comment模型中无该字段,评论需关联Post对象而非slug字符串
修复方案
修改AddCommentView的form_valid方法,通过传入的slug查询对应Post实例,再绑定到评论对象:
修改后的views.py代码
from django.shortcuts import get_object_or_404 class AddCommentView(CreateView): model = Comment form_class = CommentForm template_name = "add_comment.html" def form_valid(self, form): # 通过slug获取对应文章,不存在则返回404 post = get_object_or_404(Post, slug=self.kwargs['slug']) form.instance.post = post return super().form_valid(form) success_url = reverse_lazy('blog')
关键说明
- 确保
Post模型中定义了slug字段(建议设为唯一:models.SlugField(unique=True)),且文章对象已正确生成slug值 - 使用
get_object_or_404替代Post.objects.get,可在slug不存在时返回友好的404页面,避免服务器报错
内容的提问来源于stack exchange,提问作者Melanie
相关产品推荐
相关产品推荐

