我们在设计博客的数据库时,分别定义了博客的分类和标签,规定博客与博客的分类为一对多关系,也就是一个博客只能有一个分类,而博客的标签则为多对多的关系,一个博客可以有多个标签。按照功能来划分的话,也就是博客的标签是对博客分类的一个补充。
考虑到我们已经为博客网站设计了标签云,如果再设计一个分类云的话,就显得重复了,为此,我们不再单独创建分类页面,而直接在博客详情页面中添加博客分类的入口,这样既能查询到该博客分类下的所有博客,也避免了功能上的重复。
分类详情页面的设计跟标签详情页面时一模一样的,这里直接给代码。
1、创建模板
可以直接将tag-detail.html直接复制重命名为category-detail.html即可,因为他们看起来是一样的。
category-detail.html
{% extends 'base.html' %}
{% block title %}
{{ category_name }}分类
{% endblock %}
{% block content %}
<div class="content-wrap">
...
{% endblock %}
这里面写法同标签详情页是一样的,这里不再赘述了,不要忘了添加上分页。
2、创建视图函数
view.py
class CategoryDetaiView(View):
def get(self, request, category_name):
category = Category.objects.filter(name=category_name).first()
cate_blogs = category.blog_set.all()
# 分页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
p = Paginator(cate_blogs, 5, request=request)
cate_blogs = p.page(page)
return render(request, 'category-detail.html', {
'cate_blogs': cate_blogs,
'category_name': category_name,
})
3、创建url
urls.py
from myblog.views import CategoryDetaiView
url(r'^category/(?P<category_name>\w+)/$', CategoryDetaiView.as_view(), name='category_name'),
4、修改模板
修改主页和博客详情页的模板,将分类url添加进来。
index.html
<a href="{% url 'category_name' blog.category.name %}" itemprop="url" rel="index">
<span itemprop="name">{{ blog.category.name }}</span>
</a>
同样别忘了在博客详情页面中将分类的url添加进来。
——————————————————————————————————————————
项目的完整代码:django_blog
觉得有用的欢迎给个star。