分页
分页是指在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>

浙公网安备 33010602011771号