如何传递并在Django模板中渲染django-taggit常用标签
问题解答
你在视图中自定义的get_common_tags方法不会自动加入模板上下文,Django的ListView默认只会传递模型查询集、分页参数等内置上下文变量到模板,无法直接访问你自定义的方法返回值,必须手动将常用标签注入上下文后才能在模板中渲染。
1. 修改视图类,注入上下文
重写类视图的get_context_data方法,把常用标签追加到默认上下文中即可,你原来写的获取常用标签的逻辑可以保留:
class Home(ListView): model = Model template_name = 'home.html' def get_common_tags(self): return Model.tags.most_common()[:2] def get_context_data(self, **kwargs): # 先获取父类生成的默认上下文,保证ListView原有功能正常 context = super().get_context_data(**kwargs) # 将常用标签存入上下文,key名就是模板中调用的变量名 context['common_tags'] = self.get_common_tags() return context
2. 模板中渲染常用标签
直接遍历传入的common_tags变量即可。注意你之前贴的单对象标签遍历代码存在笔误:{% for %}循环对应的结束标签是{% endfor %},不是{% endif %},使用时需要修正避免模板报错。
参考模板代码:
<!-- 渲染Top2常用标签区域 --> <div class="top-tags"> <p>热门标签:</p> {% for tag in common_tags %} <span class="tag"> {{ tag.name }} <!-- most_common返回的标签自带num_times属性,为标签关联次数,可按需使用 --> ({{ tag.num_times }}) </span> {% endfor %} </div> <!-- 原有遍历列表对象标签的逻辑,修正结束标签后可正常使用 --> {% for item in object_list %} <div class="item"> <h3>{{ item.title }}</h3> {% for tag in item.tags.all %} <p>{{ tag }}</p> {% endfor %} </div> {% endfor %}
不推荐在模板中直接调用标签查询逻辑:模板应当只负责渲染传入的数据,数据库查询逻辑放在视图层更符合Django的MVT设计规范,也更方便后续维护。
内容的提问来源于stack exchange,提问作者Yehuda
相关产品推荐
相关产品推荐

