19. Django进阶:分页

一、定义

  • 分页是指在web页面有大量数据需要显示,为了阅读方便在每个页面中只显示部分数据
  • 优点
    • 方便阅读
    • 减少数据提取量,减轻服务器压力
  • 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异常

InvalidPage:总的异常基类,包含以下两个异常子类

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

五、Page对象

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

创建对象:

  • Paginator对象的page()方法返回Page对象
  • page = paginator.page(页码)

六、Page对象属性

  • pbject_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异常

八、测试

8.1. 视图函数

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', 'j', 'k']
    # 初始化paginator
    paginator = Paginator(all_data, 3)
    # 初始化 具体页码对应page对象
    c_page = paginator.page(int(page_num))
    return render(request, 'test_page.html', locals())

在这里插入图片描述

8.2. 路由

from django.urls import path
from . import views
urlpatterns = [
    path('test_page', views.test_page),
]

8.3. 界面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>分页</title>
</head>
<body>
{% for p in c_page %}
    <p>{{ p }}</p>
{% endfor %}

{% if c_page.has_previous %}
    <a href="/test_page?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={{ next_page_number }}">下一页</a>
{% else %}
    下一页
{% endif %}
</body>
</html>

在这里插入图片描述

8.4. 效果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KaiSarH

如果觉得文章不错,可以支持下~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值