解决了以下问题
- 首页实现了分页功能
- 把视图修改成类的通用视图ListView和DetailView
通用视图ListView
博客首页、分类、归档、标签等和首页类似的页面,都是同理的,都是一样的格式,无非是需要显示的文章的列表不一样。
关于类的通用视图的介绍,可以参考基于类的通用视图:ListView 和 DetailView
首先是针对首页的ListView
1 | blog/views.py |
同时,URL需要这样配置:
1 | blog/urls.py |
如果没有特殊需求,这样就足够了,就会显示所有的文章。
然后是分类页面Category的ListView
1 | ... |
CategoryView
可以直接继承IndexView
,因为它们有一些代码是相同的,可以减少代码的重复量。
URL配置如下:
1 | blog/urls.py |
再然后是归档Archives的ListView
1 | ... |
这个和CategoryView是类似的。
同理,URL配置需要这样修改:
1 | blog/urls.py |
标签TagView不再重复
道理是一样的。
还有内容页的视图DetailView
1 | blog/views.py |
然后URL配置需要修改一下:
1 | blog/urls.py |
这样设置以后,就可以正常使用了。
但是我遇到了以下的坑
- 我的首页,不只是有
blog_list
这一个字典,还有网页的标题。 - 分页功能还没有加入进来。
- 内容页面,我还需要上一篇和下一篇这样的功能。
于是做以下修改
ListView
里面复写get_context_data
函数,就可以传递额外的参数,我这样加入网页标题和分页功能。
1 | ... |
这里的坑有:
- 如果是自己输入代码,一定要注意拼写,拼写错误真的很难发现。
get_page_title
函数是后来加的,在我看到这个函数是必不可少的。因为后面的CategoryView
,ArchivesView
,TagView
都是继承的IndexView
,IndexView
设置网页标题的函数在get_context_data
部分,如果不用get_page_title
函数,那么IndexView
派生的类,都需要重写这个get_context_data
函数来更改网页标题,这个函数还包含着分页功能部分,需要全部复制过来。而使用get_page_title
只是为了设置文章标题,派生类只需要重写get_page_title
这个函数即可。- 分页部分基本上是复制的Django Pagination 完善分页,没有什么变化。
- 分页部分还要在
index.html
里面加入下面代码
1 | ... |
- 为了分页显示的好看,需要加入样式:
1 | ... |
所以派生类变成了这样
1 | ... |
每个派生类都重写了get_queryset
来获取文章列表,重写了get_page_title
更新页面标题。
博客详情页面也要修改
复制过来的代码,是没有上一篇和下一篇这样的功能的,于是需要自己写进去。无非就是把以前的代码更新一下写法就可以了。
1 | ... |
大功告成。
PS:写的有点乱,将就着看吧。