Django如何从views的for循环取上下文传模板,实现主题条目及对应评论展示
解决方案
问题核心
你当前的实现将所有条目对应的评论汇总为一个独立列表传入模板,模板遍历全量评论列表时未和当前条目绑定,导致所有评论都会展示在每一条条目下方。利用Django ORM自带的反向关联特性就能直接实现需求,还可以通过预加载优化查询性能。
1. 视图层代码修改(views.py)
删除手动拼接评论列表的逻辑,新增预加载配置减少数据库查询次数:
--snip-- def topic(request, topic_id): topic = Topic.objects.get(id=topic_id) # prefetch_related会一次性查询所有条目对应的评论,避免循环时重复查询数据库 entries = topic.entry_set.prefetch_related('comment_set').all() context = {'topic': topic, 'entries': entries} return render(request, 'learning_logs/topic.html', context)
2. 模板层代码修改(topic.html)
直接遍历当前条目自带的反向关联评论集合即可:
{% extends 'learning_logs/base.html' %} {% block content %} <p>{{ topic.title }}</p> <p>{{ topic.description }}</p><br> <p>Entries:</p><br> <ul> {% for entry in entries %} <li>{{ entry.text }}</li> <ul> <p>Comments:</p> {% for comment in entry.comment_set.all %} <li>{{ comment.text }}</li> {% empty %} <li>暂无评论</li> {% endfor %}<br> </ul> {% empty %} <li>暂无条目</li> {% endfor %} </ul> {% endblock content %}
实现原理
你在Comment模型中已经定义了指向Entry的外键字段,Django会自动为每个Entry实例生成comment_set反向关联属性,调用该属性即可直接获取当前条目对应的所有专属评论,无需手动在视图层汇总全量评论。
内容的提问来源于stack exchange,提问作者Rinatster
相关产品推荐
相关产品推荐

