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

Django博客用django-taggit实现标签详情页时出现404错误求助

我来帮你搞定这个404的问题,仔细看了下你的代码,发现几个关键的小错误,一个个修正就好:

1. 删掉自定义的Tag模型,避免冲突

你在models.py里自己写了个Tag类,但django-taggit已经内置了一套完整的Tag模型,你自定义的这个不仅没用,还会让查询指向空的自定义表,自然找不到数据。直接把这段代码删掉:

class Tag(models.Model):
    name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.name

2. 修正URL正则表达式的错误

你的标签URL正则r'^tag/(?P<tag>[-/w]+)/$'有两个问题:

  • w要写成\w(小写w是普通字符,大写\w才代表字母/数字/下划线)
  • 字符组里的/是多余的,会导致URL解析混乱
    改成下面这样,顺便把参数名改成tag_slug更贴合django-taggit的字段设计:
url(r'^tag/(?P<tag_slug>[-\w]+)/$', views.tag_detail, name='tag_detail'),

3. 重写tag_detail视图的查询逻辑

原来的视图里get_object_or_404(Tag, tag=tag)完全不对——django-taggit的Tag模型根本没有tag这个字段,正确的字段是name或slug(推荐用slug,URL更友好)。另外,你肯定是想展示带该标签的文章,不是只返回标签对象对吧?修改后的视图:

def tag_detail(request, tag_slug):
    # 通过slug精准获取标签
    tag = get_object_or_404(Tag, slug=tag_slug)
    # 筛选出带该标签的已发布文章,按发布时间倒序
    posts = Post.objects.filter(
        tags__in=[tag], 
        published_date__lte=timezone.now()
    ).order_by('-published_date')
    return render(request, 'blog/tag_detail.html', {'tag': tag, 'posts': posts})

4. 模板里正确渲染内容

最后在tag_detail.html里,你可以这样展示标签和对应的文章列表:

<h1>标签:{{ tag.name }}</h1>
{% for post in posts %}
    <article class="post">
        <h2><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h2>
        <p class="date">发布于:{{ post.published_date }}</p>
        <p>{{ post.text|truncatewords:30 }}</p>
    </article>
{% empty %}
    <p>还没有带这个标签的文章哦~</p>
{% endfor %}

做完这些修改后,记得重启服务器,再访问http://127.0.0.1:8080/tag/sample/试试,应该就能正常显示对应标签的文章了!

内容的提问来源于stack exchange,提问作者Róbert Péczi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:43:13