分页
分页是指在web页面有大量数据需要显示时,当一页的内容太多不利于阅读和不利于数据提取的情况下,可以分为多页进行显示。
Django提供了一些类来帮助你管理分页的数据 — 也就是说,数据被分在不同页面中,并带有“上一页/下一页”链接。
这些类位于django/core/paginator.py中。
一Paginator对象
1.对象的构造方法
- Paginator(object_list, per_page)
- 参数
- object_list 对象列表
- per_page 每页数据个数
- 返回值:
- 分页对象
2.Paginator属性
- count:对象总数
- num_pages:页面总数
- page_range:从1开始的range对象, 用于记录当前面码数
- per_page 每页个数
3.Paginator方法
Paginator.page(number)
- 参数 number为页码信息(从1开始)
- 返回当前number页对应的页信息
- 如果提供的页码不存在,抛出InvalidPage异常
4.Paginator异常exception
- InvalidPage:当向page()传入一个无效的页码时抛出
- PageNotAnInteger:当向page()传入一个不是整数的值时抛出
- EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出
二Page对象
创建对象 Paginator对象的page()方法返回Page对象,不需要手动构造
1.Page对象属性
- object_list:当前页上所有对象的列表
- number:当前页的序号,从1开始
- paginator:当前page对象相关的Paginator对象
2.Page对象方法
- has_next():如果有下一页返回True
- has_previous():如果有上一页返回True
- has_other_pages():如果有上一页或下一页返回True
- next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
- previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
- len():返回当前页面对象的个数
3.说明
Page 对象是可迭代对象,可以用 for 语句来 访问当前页面中的每个对象
参考文档https://docs.djangoproject.com/en/1.11/topics/pagination/
分页示例:
视图函数
def book(request): bks = models.Book.objects.all() paginator = Paginator(bks, 10) print('当前对象的总个数是:', paginator.count) print('当前对象的面码范围是:', paginator.page_range) print('总页数是:', paginator.num_pages) print('每页最大个数:', paginator.per_page) cur_page = request.GET.get('page', 1) # 得到默认的当前页 page = paginator.page(cur_page) return render(request, 'bookstore/book.html', locals())
模板设计
<html> <head> <title>分页显示</title> </head> <body> {% for b in page %} <div>{{ b.title }}</div> {% endfor %} {# 分页功能 #} {# 上一页功能 #} {% if page.has_previous %} <a href="{% url "book" %}?page={{ page.previous_page_number }}">上一页</a> {% else %} 上一页 {% endif %} {% for p in paginator.page_range %} {% if p == page.number %} {{ p }} {% else %} <a href="{% url "book" %}?page={{ p }}">{{ p }}</a> {% endif %} {% endfor %} {#下一页功能#} {% if page.has_next %} <a href="{% url "book" %}?page={{ page.next_page_number }}">上一页</a> {% else %} 上一页 {% endif %} 总页数: {{ page.len }} </body> </html>