同样的写好分类页面的视图函数:
blog/views.py import markdown from django.shortcuts import render, get_object_or_404 # 引入 Category 类 from .models import Post, Category def category(request, pk): # 记得在开始部分导入 Category 类 cate = get_object_or_404(Category, pk=pk) post_list = Post.objects.filter(category=cate).order_by('-created_time') return render(request, 'blog/index.html', context={'post_list': post_list})这里我们首先根据传入的 pk 值(也就是被访问的分类的 id 值)从数据库中获取到这个分类。get_object_or_404 函数和 detail 视图中一样,其作用是如果用户访问的分类不存在,则返回一个 404 错误页面以提示用户访问的资源不存在。然后我们通过模型管理器的 filter 方法过滤出了该分类下的全部文章。同样也和首页视图中一样对返回的文章列表进行了排序。
URL 配置如下:
blog/urls.py urlpatterns = [ path('archives/<int:year>/<int:month>/', views.archive,), path('categories/<int:pk>/', views.category,), ]这个分类页面对应的 URL 模式和文章详情页面对应的 URL 模式十分类似,你可以自己分析分析它是如何工作的,在此就不赘述了。
修改相应模板:
inclusions/_categories.html ... {% for category in category_list %} <li> <a href="{% url 'blog:category' category.pk %}">{{ category.name }}</a> </li> {% endfor %} ...同样,{% url %} 模板标签的用法和写归档页面时的用法是一样的。现在尝试点击相应的链接,就可以跳转到归档或者分类页面了。
标签页面标签页和分类是完全一样的步骤,因此稍微修改一下分类相关的代码就可以用于标签了。
blog/views.py from .models import Category, Post, Tag def tag(request, pk): # 记得在开始部分导入 Tag 类 t = get_object_or_404(Tag, pk=pk) post_list = Post.objects.filter(tags=t).order_by('-created_time') return render(request, 'blog/index.html', context={'post_list': post_list})可以看到和 category 几乎一样,只是这里根据 tag 来筛选文章。
然后是配置 url:
from django.urls import path from . import views app_name = 'blog' urlpatterns = [ ... path('categories/<int:pk>/', views.category,), path('tags/<int:pk>/', views.tag,), ]再修改一下 inclusions\_tags.html 模板中的跳转链接:
... {% for tag in tag_list %} <li> <a href="{% url 'blog:tag' tag.pk %}">{{ tag.name }}</a> </li> {% empty %} 暂无标签! {% endfor %} ...侧边栏的功能这里差不多就都做完了。