Django帖子与评论关联显示异常问题求助
解决Django帖子与评论关联显示异常的问题
问题根源分析
你遇到的两个问题本质上都是关联判断逻辑错误:
- 未添加判断时,每个帖子都会遍历所有评论,所以每篇帖子都会显示全部2条评论;
- 添加
{% if comment.post == data.title %}后,comment.post是Post模型的实例对象,而data.title是字符串类型的帖子标题,两者类型完全不同,永远不可能相等,所以评论完全不显示。
最优解决方案:利用ORM关联直接获取单帖评论
你的Comment模型已经设置了related_name='comments',这意味着每个Post实例都可以直接通过post.comments访问属于它的所有评论,这是Django ORM提供的便捷关联方式,还能避免低效的全量评论遍历。
步骤1:优化视图函数(views.py)
不需要再单独查询所有评论,直接通过prefetch_related预加载关联评论(优化查询性能,避免N+1问题):
def post(request): # 预加载每个帖子对应的评论,提升页面加载效率 datas = Post.objects.order_by('-date').prefetch_related('comments') return render(request, 'post.html', {'datas': datas})
步骤2:修改模板逻辑(post.html)
直接通过当前帖子对象data访问它的评论集合,无需再循环所有评论做判断:
<div class="card-action"> {% for comment in data.comments.all %} {{ comment.date }}<br> <strong>{{ comment.author }}</strong> <p>{{ comment.content }}</p> {% empty %} <p>There is no comments</p> {% endfor %} </div>
备选方案:修正判断条件(不推荐,效率较低)
如果你坚持要在视图中传递所有评论到模板,只需把判断条件改为比较Post实例对象而非标题字符串:
{% for comment in comments %} {% if comment.post == data %} <!-- 这里比较的是Post实例,而非标题字符串 --> {{ comment.date }}<br> <strong>{{ comment.author }}</strong> <p>{{ comment.content }}</p> {% endif %} {% empty %} <p>There is no comments</p> {% endfor %}
这种方法需要遍历所有评论,当评论数量较多时会影响性能,因此优先推荐第一种方案。
额外小提示
你的Comment模型里有个拼写错误:add_coment应该改为add_comment,虽然不影响当前功能,但保持代码规范更好哦~
内容的提问来源于stack exchange,提问作者MINSIK
相关产品推荐
相关产品推荐

