如何使用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
相关产品推荐
相关产品推荐

