分页
- Django提供了数据分页的类,这些类被定义在django/core/paginator.py中
- 对象Paginator用于对列进行一页n条数据的分页运算
- 对象Page用于表示第m页的数据
Paginator对象
- 方法init(列表,int):返回分页对象,参数为列表数据,每面数据的条数
- 属性count:返回对象总数
- 属性num_pages:返回页面总数
- 属性page_range:返回页码列表,从1开始,例如[1, 2, 3, 4]
- 方法page(m):返回Page对象,表示第m页的数据,下标以1开始
Page对象
- 调用Paginator对象的page()方法返回Page对象,不需要手动构造
- 属性object_list:返回当前页对象的列表
- 属性number:返回当前是第几页,从1开始
- 属性paginator:当前页对应的Paginator对象
- 方法has_next():如果有下一页返回True
- 方法has_previous():如果有上一页返回True
- 方法len():返回当前页面对象的个数
- 迭代页面对象:访问当前页面中的每个对象
#视图
from django.core.paginator import Paginator
def page(request):
# GET 获取 模板 <a href="?index=1">首页</a> 的index=的value
p_index = request.GET.get('index',1)
# print(type(p_index)) # 获取的数据类型<class 'str'>
# 查询地区表,过滤没有父级元素的省份
province = AreaInfo.objects.filter(aParent__isnull=True)
# 创建对象paginator对象,将 province分页,每页3个数据
paginator = Paginator(province,3)
# 获取总页数
total_pages = paginator.num_pages
# 判断如果页数输入为空, 展示第一页
if p_index=='':
p_index=1
p_index = int(p_index) # 需要将str >> int 类型
# 如果小于1,也显示第一页
if p_index <1:
p_index=1
# 如果大于总页数,则显示最后一页
if p_index > total_pages:
p_index=total_pages
# 获取 页
p = paginator.page(p_index)
# n表示当前页: n-5,n-4,n-3,n-2,n-1, n, n+1,n+2,n+3,n+4,(公式,以n为中心)
# 将所有数据以10页 10页的显示
# 如果页数<10, 显示的页数如下
if total_pages <=10:
page_list=range(1,total_pages+1)
# 如果总页数>10,而当前页的数字小于5, 不符合公式
elif p_index<=5:
page_list=range(1,11)
# 总页为19页,当前页应为15,才符合公式
# 10 11 12 13 14 15 16 17 18 19 ,大于15的话,条件不成立,不符合公式
elif p_index>=total_pages-4:
page_list=range(total_pages-9,total_pages+1)
# 其他则满足 公式即可
else:
page_list=range(p_index-5,p_index+5)
return render(request,'page.html', {"p":p,'page_list':page_list})
# 模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
</head>
<body>
<ul>
<!--显示省份信息-->
{% for index in p %}
<li>{{ index.title }}</li>
{% endfor %}
</ul>
<!--判断是否存在上一页-->
{% if p.has_previous %}
<a href="?index=1">首页</a>
<a href="?index={{ p.number|add:-1 }}">上一页</a>
<!--没有则不显示连接提示 -->
{% else %}
首页 上一页
{% endif %}
<!--遍历 页码-->
{% for index in page_list%}
<!--如果选中当前页,则不提示链接-->
{% if index == p.number %}
{{ index }}
<!--显示链接-->
{% else %}
<a href="?index={{ index }}">{{ index }}</a>
{% endif %}
{% endfor %}
{% if p.has_next %}
<a href="?index={{ p.number|add:+1 }}">下一页</a>
<a href="?index={{ p.paginator.num_pages }}">末页</a>
{% else %}
末页 下一页
{% endif %}
</body>
</html>