Django模板无法显示评论上下文,请求排查帮助
问题分析与解决方案
你的核心问题是:使用{% include %}引入模板时,它依赖的是父模板(list_detail.html)的上下文,而非你单独定义的listcomments视图的上下文。你的TheirDetailView没有传递评论数据到模板,导致list_comment.html里的model变量不存在,循环无法执行,所以评论不显示。
具体修复步骤
1. 优化模型字段(符合规范并简化关联)
修改models.py中Review的外键字段,将大写List改为小写list(遵循PEP8命名规范),并添加related_name方便反向查询:
class Review(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) # 修改字段名并添加反向关联名 list = models.ForeignKey(List, on_delete=models.CASCADE, related_name='reviews') comment = models.TextField(max_length=250) rate = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return str(self.comment)
2. 修改DetailView,传递评论上下文
更新views.py中的TheirDetailView,通过get_context_data方法将当前List对应的评论传递到模板:
class TheirDetailView(DetailView): model = List def get_context_data(self, **kwargs): # 先获取默认上下文 context = super().get_context_data(**kwargs) # 添加当前List的所有评论到上下文 context['reviews'] = self.object.reviews.all() return context # 可以删除多余的listcomments函数,因为不再用到它
3. 调整评论模板的循环变量
修改list_comment.html,使用新的上下文变量reviews,同时修复多余的闭合标签:
{% load static %} {% for review in reviews %} <div class="comment-contentsas"> <p class="commentor-name">{{ review.user.username }}</p> </div> <div class="comment-contentsas"> <p>{{ review.comment }}</p> </div> {% endfor %}
4. 清理无用路由
删除urls.py中多余的评论路由,因为现在评论数据是通过DetailView传递的,无需单独路由:
# 删除这一行: # path('comment/',views.listcomments, name='ListComments'),
5. 验证后台数据
确保你在后台创建的5条Review对象,都正确关联了对应的List实例(即list字段选择了具体的List对象),否则即使代码正确,也不会显示评论。
内容的提问来源于stack exchange,提问作者Ayat Rahman
相关产品推荐
相关产品推荐

