随着时间的推移(加上勤奋的写作!),你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。这个时候就需要对文章进行分页的处理。利用轮子写一个完善的分页功能是有些难度的,好在Django已经帮你准备好一个现成的分页模块了(Django把大部分基础功能都替你准备好了!)。内置模块虽然简单,但是对博客来说完全足够了。我们要用到的是Paginator类。在Shell中可以充分尝试它的用法:>>> from django.core.paginator import Paginator>>> objects = [‘john’, ‘paul’, ‘george’, ‘ringo’]>>> p = Paginator(objects, 2)>>> p.count4>>> p.num_pages2>>> p.page_rangerange(1, 3)>>> page1 = p.page(1)>>> page1<Page 1 of 2>>>> page1.object_list[‘john’, ‘paul’]>>> page2 = p.page(2)>>> page2.object_list[‘george’, ‘ringo’]>>> page2.has_next()False>>> page2.has_previous()True>>> page2.has_other_pages()True>>> page2.previous_page_number()1这是一个官网的例子。详见:Pagination有了这个类,剩下的工作就是把它应用到项目中去。轻车熟路要对文章列表分页,因此就要修改article/views.py的def article_list()视图:article/views.py…# 引入分页模块from django.core.paginator import Paginatordef article_list(request): # 修改变量名称(articles -> article_list) article_list = ArticlePost.objects.all() # 每页显示 1 篇文章 paginator = Paginator(article_list, 1) # 获取 url 中的页码 page = request.GET.get(‘page’) # 将导航对象相应的页码内容返回给 articles articles = paginator.get_page(page) context = { ‘articles’: articles } return render(request, ‘article/list.html’, context)…在视图中通过Paginator类,给传递给模板的内容做了手脚:返回的不再是所有文章的集合,而是对应页码的部分文章的对象,并且这个对象还包含了分页的方法。我们在前面的文章已经接触过一些将参数传递到视图的手段了:通过POST请求将表单数据传递到视图通过url将地址中的参数传递到视图这里用到了另一种方法:在GET请求中,在url的末尾附上?key=value的键值对,视图中就可以通过request.GET.get(‘key’)来查询value的值。然后改写模板,在最末尾的</div>前面,加入分页的内容:templates/article/list.html…<!– 页码导航 –><div class=“pagination row”> <div class=“m-auto”> <span class=“step-links”> <!– 如果不是第一页,则显示上翻按钮 –> {% if articles.has_previous %} <a href="?page=1" class=“btn btn-success”> &laquo; 1 </a> <span>…</span> <a href="?page={{ articles.previous_page_number }}" class=“btn btn-secondary” > {{ articles.previous_page_number }} </a> {% endif %} <!– 当前页面 –> <span class=“current btn btn-danger btn-lg”> {{ articles.number }} </span> <!– 如果不是最末页,则显示下翻按钮 –> {% if articles.has_next %} <a href="?page={{ articles.next_page_number }}" class=“btn btn-secondary” > {{ articles.next_page_number }} </a> <span>…</span> <a href="?page={{ articles.paginator.num_pages }}" class=“btn btn-success” > {{ articles.paginator.num_pages }} &raquo; </a> {% endif %} </span> </div></div>…内容也比较简单,用到了前面的Shell中演示的部分方法,判断当前页所处的位置。这样就行了!补充几篇文章(笔者共6篇),方便测试。刷新页面后是这样的:视图中设置了每页只有1篇文章,所以就真的只有1篇了。当然这只是为了测试,实际环境中肯定要远大于1篇的。点击第2页的按钮后是这样的:看到顶部地址栏中的变化了吗?思考一下page是如何从模板传递到视图的。总结除模板外,我们只写了4行代码,就有了还不错的分页导航,Django就是这么贴心。除了对文章列表,你可以对任何你想分页的地方运用此模块(比如以后要讲到的评论),满足用户各类的需求。读者还可以稍加阅读Bootstrap 4官方文档,改写一个符合自己品味的外观。有疑问请在杜赛的个人网站留言,我会尽快回复。或Email私信我:dusaiphoto@foxmail.com项目完整代码:Django_blog_tutorial转载请并注明出处。