Django-25 分页
2021-08-01 本文已影响0人
JuliusL
- 分页是指在web页面有大量数据需要显示,为了阅读方便在每个页面中只显示部分数据
- 优点:
1,方便阅读
2,减少数据提取量,减轻服务器压力 - Django提供了Paginator类可以方便的实现分页功能
- Paginator类位于 'django.core.paginator' 模块中
Paginator 对象
负责分页数据整体的管理
对象的构造方法
paginator = Paginator(object_list,per_page)
- 参数
- object_list 需要分类数据的对象列表
- per_page 每页数据个数
- 返回值
- Paginator的对象
Paginator 属性
- count:需要分页数据的对象总数
- num_pages:分页后的页面总数
- page_range:从1开始的range对象,用于记录当前码数
- per_page:每页数据的个数
Paginator方法
paginator对象.page(number)
- 参数number为页码信息(从1开始)
- 返回当前number页对应的页信息
- 如果提供的页码不存在,抛出InvalidPage异常
Paginator异常exception
InvalidPage:总的异常基类,包含以下两个异常子类
- PageNotAnInteger:当向page() 传入一个不是整数的值时抛出
- EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出
Page对象
负责具体某一页的数据的管理
创建对象
Paginator对象的page()方法返回Page对象
page = paginator.page(页码)
Page对象属性
- object_list:当前页上所有数据对象的列表
- number:当前页的序号,从1开始
- pageinator:当前page对象相关的Paginator对象
Page对象方法
- has_next():如果有下一页返回True
- has_previous():如果有上一页返回True
- has_other_pages():如果有上一页或下一页返回True
- next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
- previos_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
例子
分页Demo.png/templates/index/test_page.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>分页</title>
</head>
<body>
{% for p in c_page %}
<p>
{{p}}
<p>
{% endfor %}
{% if c_page.has_previous %}
<a href="/test_page?page={{ c_page.previous_page_number }}">上一页</a>
{% else %}
上一页
{% endif %}
{% for p_num in paginator.page_range %}
{% if p_num == c_page.number %}
{{ p_num }}
{% else %}
<a href="/test_page?page={{ p_num }}">{{ p_num }}</a>
{% endif %}
{% endfor %}
{% if c_page.has_next %}
<a href="/test_page?page={{c_page.next_page_number}}">下一页</a>
{% else%}
下一页
{% endif %}
</body>
</html>
views.py
def test_page(request):
#/test_page/4
#/test_page?page=1
page_num = request.GET.get('page',1)
all_data = ['a','b','c','d','e','f','g','h','i']
#初始化paginator
paginator = Paginator(all_data,2)
#初始化,具体页码的page对象
c_page = paginator.page(int(page_num))
return render(request,'index/test_page.html',locals())