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
相关产品推荐
相关产品推荐

