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

如何使用django-taggit实现按标签筛选并展示文章列表?

问题解决办法

核心问题原因

你当前的代码存在2个核心错误:

  • get_queryset返回的是taggit的中间表TaggedItem实例集合,不是你自己的文章模型实例,直接输出自然只能看到中间表对象的默认字符串表示
  • 你没有把当前匹配的标签对象传入模板上下文,也没有正确读取文章标题属性

修正后的view.py代码

from taggit.models import TaggedItem, Tag
# 导入你自己的文章模型,假设你定义的模型类叫Article
from .models import Article

class ArticlesByTagsList(ListView):
    template_name = 'articles/articles_by_tags.html'
    context_object_name = 'articles_list'

    def get_queryset(self):
        # 直接通过文章模型的标签字段筛选,逻辑更简洁
        return Article.objects.filter(tags__slug=self.kwargs['tag'])
        # 如果一定要用TaggedItem实现,可替换为以下写法,返回的仍为文章实例
        # return [item.content_object for item in TaggedItem.objects.filter(tag__slug=self.kwargs['tag'])]

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['tags_list'] = Tag.objects.all()
        # 把当前查询的标签传入上下文,供页面标题显示
        context['current_tag'] = Tag.objects.get(slug=self.kwargs['tag'])
        return context

注意:如果你的路由参数里传的是标签的name不是slug,把上面代码里的slug改成name即可。

修正后的模板代码

{% block content %}
    <h1>标签:{{ current_tag.name }} 下的文章</h1>
    {% for item in articles_list %}
        <h2>{{ item.title }}</h2>
        <!-- 如需跳转到文章详情页可修改为:<h2><a href="{{ item.get_absolute_url }}">{{ item.title }}</a></h2> -->
    {% empty %}
        <p>该标签下暂无文章</p>
    {% endfor %}
{% endblock %}

注意:如果你的文章模型的标题字段不叫title,把模板里的item.title改成你对应的字段名即可。

内容的提问来源于stack exchange,提问作者ilsurealism

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 04:15:01