如何在Django应用中为每个Item设置独立的专属评论区
问题修复方案
1. 修正models.py字段定义
你当前使用的OneToOneField为一对一关系,会限制单个Item只能关联1条评论、单个用户只能发布1条评论,不符合评论场景的一对多需求,修改为ForeignKey:
class Comment(models.Model): comment_user = models.ForeignKey(User, on_delete=models.CASCADE) item = models.ForeignKey(Item, on_delete=models.CASCADE, related_name="comments") content = models.TextField(default='')
修改后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。
2. 修正views.py评论查询逻辑
你之前调用Comment.objects.all()查询了全站点所有评论,所以所有Item页面都会展示相同的评论,需要过滤出当前详情页对应Item的关联评论:
class ShopDetailView(DetailView): model = Item template_name = 'shop/detail.html' context_object_name = 'item' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 仅查询当前Item的关联评论 context['comments'] = Comment.objects.filter(item=self.object) # 也可以用定义的related_name简化写法:context['comments'] = self.object.comments.all() return context
模板遍历示例
在detail.html中可以直接遍历comments变量展示对应评论:
{% for comment in comments %} <div class="comment"> <span>用户:{{ comment.comment_user.username }}</span> <p>{{ comment.content }}</p> </div> {% empty %} <p>该商品暂无评论</p> {% endfor %}
内容的提问来源于stack exchange,提问作者user16476339
相关产品推荐
相关产品推荐

