在项目中很常见的一种功能,主要用于大量数据在一页显示过于冗长,分为一页显示多条数据,分隔为多页显示;并常与条件筛选结合使用。
目录
Paginator对象
创建对象
属性
方法
异常
Page对象
创建对象
属性
方法
Paginator与page关系
示例
路由
视图
模板
创建列表页面
设置分页
当前页码不可点击
总结
格式:Paginator(列表,整数)
返回值:返回分页对象
count 对象的总数
num_pages 页面总数
page_range [1,2, 3, 4],页码列表,从1开始。
page(num) 获得一个page对象,如果提供的页码不存在,会抛出”invoalidPage”
involidPage 当向page()传递的是一个无效的页码时抛出
pageNotAnIntrger 当向page()传递的不是一个整数时抛出
emptyPage 当向page()传递一个有效值,但是该页面没有数据时抛出
Pageinator对象的page()方法返回得到page对象。不需要手动创建。
object_list 当前页上所有数据(对象)的列表
number 当前页的页码值
Paginator 当前page对象关联的paginator对象
has_next() 判断是否有下一页,如果有返回True
has_previouts() 判断是否有上一页,如果有返回True
has_other_pages 判断是否有上一页或下一页,如果有返回True
next_page_number() 返回下一页的页码,如果下一页不存在抛出invalidPage异常
previous_page_number() 返回上一页的页码,如果下一页不存在抛出invalidPage异常
len() 返回当前页的数据(对象)个数
1.获取班级所有数据记录
2.传递数据集和每页2条给Paginator对象
3.Page对象根据当前分页页码请求相应记录数据
看过上面的概念后,开始实际操作,还是通过完整的MTV来演示。
设置分页列表路由,增加一个页码参数设置。
urlpatterns = [
path(r'grade_list/', views.grade_list, name='grade_list'),
]
获取班级列表数据,做分页处理,赋值模板。
def grade_list(request, num):
""" 班级分页列表 """
# 所有班级记录列表
gradeList = Grades.objects.all()
# 实例化Paginator 每页显示2条
paginator = Paginator(gradeList, 2)
# 获取当前页码数据
res = paginator.page(num)
return render(request, 'myapp/gradeList.html', {'res': res})
内容如下:
班级分页列表
{# 列表内容 #}
{% for item in res %}
- {{item.name}}
{% endfor %}
在班级列表下,增加列表页码。
{# 设置分页页码 #}
{% for index in res.paginator.page_range %}
- {{index}}
{% endfor %}
在循环中通过判断分页的当前页码字段,设置当前页码不可点击。
{# 设置分页页码 #}
{% for index in res.paginator.page_range %}
{% if res.number == index %}
- {{index}}
{% else %}
- {{index}}
{% endif %}
{% endfor %}
分页的实现就是把封装好的功能,通过对外的入口,传递相应参数就可调用;
实际开发中易于操作方便我们的调用,节省时间。
Django分页原理:获取所有符合条件数据,然后实例化分页对象,最后通过分页对象获取分页数据,返回响应和数据。