1. 添加分页器
当你开始在你的博客中添加内容时,您可能很容易在数据库中存储数十或数百篇文章的地步。与在单个页面上显示所有文章不同,您可能希望将文章列表拆分为多个页面。这就需要通过分页器来实现,你可以通过定义一个数字去用于你想要在一个页面上显示文章数量,并且展示与用户请求的页面对应的帖子。Django 提供了一个内置的分页器,它允许你很简单的管理分页数据。
在你的 blog
应用程序中编辑 views.py
文件,去导入一个 Django 分页类,并且修改 post_list
视图。 如下所示:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def post_list(request):
object_list = Post.published.all()
paginator = Paginator(object_list, 3) # 每 3 篇博客一页
page = request.GET.get('page')
try:
posts = paginator.page(page)
except PageNotAnInteger:
# 如果页面不是整数,就返回第一页
posts = paginator.page(1)
except EmptyPage:
# 如果页面超出范围,就提交结果的最后一页
posts = paginator.page(paginator.num_pages)
return render(request,
'blog/post/list.html',
{'posts': posts,
'page': page})
接下来介绍 分页器是如何工作的:
- 你通过每页想要显示的文章数量 根据
Paginator
类实例化一个对象。
- 你通过每页想要显示的文章数量 根据
- 你得到
page.GET
参数,它表示当前页码。
- 你得到
- 通过调用
Paginator
的page()
方法,可以获得所需页面的对象。
- 通过调用
- 如果
page
参数不是一个整数,就返回结果的第一页。如果这个参数是一个超过了结果最后一页的大整数,就返回最后一个的结果。
- 如果
- 将页码和检索到的对象传递给模板。
现在你将要创建用于显示分页的模板,以至于可以把这个模板应用于任何想要分页的模板中。 在 blog
应用程序的 templates/
目录中,创建一个名称为 pagination.html
的新文件,添加下面的这些 HTML 代码到这个文件中去:
<div class="pagination">
<span class="step-links">
{% if page.has_previous %}
<a href="?page={{ page.previous_page_number }}">Previous</a>
{% endif %}
<span class="current">
Page {{ page.number }} of {{ page.paginator.num_pages }}.
</span>
{% if page.has_next %}
<a href="?page={{ page.next_page_number }}">Next</a>
{% endif %}
</span>
</div>
分页模板需要一个 Page
对象来呈现 上一个 和 下一个 的链接,并且去显示 结果所有页码以及当前的页码。让我们回到 blog/post/list.html
模板,并且在pagination.html
模板包含在底部的 {% content %}
快中,如下所示:
{% block content %}
....
{% include "pagination.html" with page=posts %}
{% endblock %}
因为你要传递给模板的Page
对象 称为 posts
, 所以你要把 分页模板 包含在 文章列表模板中,传递参数以正确呈现它。可以使用此方法在不同模型的分页视图中重用分页模板。
在你的 浏览器中 打开 http://127.0.0.1:8000/
,你可以在 文章列表的底部看到这个分页,并且应该能够浏览页面。
![](https://img.haomeiwen.com/i16514139/82e50aef3637a5ee.jpg)
网友评论