分页
- 分页是指在web页面有大量数据需要显示,为了方便在每个页面中只显部分数据
- Django中提供了Paginator类可以方便的实现分页功能
- from django.core.paginator import Paginator
Paginator对象
paginator = Paginator(object_list,per_page)
'''
object_list : 需要分页数据对象列表
per_page : 每页数据个数
返回值 : Paginator对象
'''
'''
Paginator属性
count: 需要分页数据的对象总数
num_pages:分页后的页面总数
page_range:从1开始的range对象,用于记录当前页码数
per_page:每页的个数
'''
Paginator.page(number)
'''
参数number为页码信息从1开始
返回当前number页对应的页信息
如果提供的页码不存在,抛出invalidpage异常
'''
page对象
负责具体某一页的数据的管理
创建对象:page = paginator.page(页码)
Page对象属性:
- object_list:当前页上所有数据对象的列表
- number:当前页序号
- paginator:当前page对象相关的Paginator对象
page方法:
- has_next():如果有下一个返回True
- has_previous():如果有上一页返回True
- has_other_pages():如果有上一页或者下一页返回true
- next_page_number():返回下一个的页码,不存在抛出invalidpage异常
- previous_page_number():返回上一个的页码,不存在抛出invalidpage异常
实例
# file:views.py
from django.core.paginator import Paginator
def test_page(request):
# url:/test/page/页码(1-*)
# url:/test/page?page=页码
#这里我们用第二种
page_num = request.GET.get('page',1)
all_data = ['a', 'b', 'c', 'd', 'e']
#初始化paginator
paginator = Paginator(all_data,2)
# 初始化具体页码个page对象
c_page = paginator.page(int(page_num))
return render(request,'test_page.html', locals())
file:test_page.html
{% 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>
{%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>
{%endif%}