Django分页

酥酥 发布于 2021-09-18 63 次阅读


Django分页

分页是指在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对象.page(number)

  • 参数number为页码信息(从1开始)

  • 返回当前number页对应的页信息

  • 如果提供的页码不存在,抛出InvalidPage异常

InvalidPage:总的异常基类, 包含以下两个异常子类
  • PageNotAnInteger: 当向page()传入一个不是整数的值时抛出-

  • EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出

Page对象

负责具体某一页的数据的管理

创建对象

  • Paginator对象的page()方法返回Page对象

  • page = paginator.page(页码)

Page对象属性

  • object list: 当前页上所有数据对象的列表

  • number:当前页的序号,从1开始

  • paginator:当前page对象相关的Paginator对象

Page对象方法

  • has_next():如果有下一页返回True

  • has_previous():如果有上一页返回True

  • has_other_pages():如果有上一页或下一页返回True

  • next_page_number():返回下一页的页码, 如果下一页不存在,抛出InvalidPage异常

  • previous_page_number():返回上一 页的页码,如果上一页不存在抛出InvalidPage异常

样例:
views后端代码
#/test_page/4 #/test_page?page=1
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())

在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> {%else %} 上一页 {% endif %}#有上一页甩超链接没有就不甩


{% if c_page.has_next%}
<a href="/test-page?page={{ c_page.next 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 %}