You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何传递并在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:27:26