如何在Django中自动将评论的话题设置为与所属帖子的话题一致
问题原因
你视图函数入参pk是帖子的主键,直接用该值查询话题表匹配不到对应数据,评论的话题应该直接从你关联的帖子对象中获取,不需要单独查询。另外你的模型定义存在语法错误,会导致字段校验不通过。
修复步骤
1. 先修正models.py的错误
你comments模型的topics字段on_delete参数冲突,不能同时指定CASCADE和SET_NULL,如果需要保留评论在话题删除后仍存在,调整如下:
from django.db import models from django.contrib.auth.models import User # 你原有topic模型定义保持不变即可 class topic(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name class comments(models.Model): # 修正on_delete参数,要允许空就用SET_NULL,不需要保留评论的话直接用CASCADE即可 topics = models.ForeignKey(topic, on_delete=models.SET_NULL, null=True) created = models.DateTimeField(auto_now=True) posts = models.ForeignKey(post, on_delete=models.CASCADE) owner = models.ForeignKey(User, on_delete=models.CASCADE) # 补全models前缀 comment = models.TextField(max_length=500) def __str__(self): return str(self.comment) class post(models.Model): author = models.ForeignKey(User, on_delete=models.CASCADE) Topic = models.ForeignKey(topic, on_delete=models.CASCADE) post = models.TextField(max_length=500) created = models.DateTimeField(auto_now=True) def __str__(self): return f'{self.post}'
修改完模型后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。
2. 修正views.py的话题赋值逻辑
不要用post的id查询topic,直接从你获取的post对象中取关联的Topic字段赋值即可:
def comment(request, pk): # 提前获取对应帖子对象,避免重复查询 target_post = post.objects.get(id=pk) form = commentform() context = { 'form' : form } if request.method == 'POST': form = commentform(request.POST) if form.is_valid(): forms = form.save(commit=False) forms.posts = target_post forms.owner = request.user # 直接从帖子关联属性取话题赋值 forms.topics = target_post.Topic forms.save() return redirect('home') return render(request, 'base/comment.html', context)
扩展优化说明
如果后续需要查询特定帖子下的所有评论,不需要依赖评论的topics字段,直接通过post对象反向查询即可:
# 获取id为1的帖子下的所有评论 post_obj = post.objects.get(id=1) comment_list = post_obj.comments_set.all()
内容的提问来源于stack exchange,提问作者Okafor Onyekachukwu
相关产品推荐
相关产品推荐

