Django高级扩展之Paginator分页实现

在项目中很常见的一种功能,主要用于大量数据在一页显示过于冗长,分为一页显示多条数据,分隔为多页显示;并常与条件筛选结合使用。

目录

Paginator对象

创建对象

属性

方法

异常

Page对象

创建对象

属性

方法

Paginator与page关系

示例

路由

视图

模板

创建列表页面

设置分页

当前页码不可点击

总结


Paginator对象

创建对象

格式:Paginator(列表,整数)

返回值:返回分页对象

属性

count 对象的总数

num_pages 页面总数

page_range [1,2, 3, 4],页码列表,从1开始。

方法

page(num) 获得一个page对象,如果提供的页码不存在,会抛出”invoalidPage”

异常

involidPage 当向page()传递的是一个无效的页码时抛出

pageNotAnIntrger 当向page()传递的不是一个整数时抛出

emptyPage 当向page()传递一个有效值,但是该页面没有数据时抛出

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() 返回当前页的数据(对象)个数

Paginator与page关系

1.获取班级所有数据记录

2.传递数据集和每页2条给Paginator对象

3.Page对象根据当前分页页码请求相应记录数据

示例

看过上面的概念后,开始实际操作,还是通过完整的MTV来演示。

路由

设置分页列表路由,增加一个页码参数设置。

urlpatterns = [
    path(r'grade_list/<int:num>', views.grade_list, name='grade_list'),
]

视图

获取班级列表数据,做分页处理,赋值模板。

from django.core.paginator import Paginator


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})

模板

创建列表页面

内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>班级分页列表</title>
</head>
<body>
    {# 列表内容 #}
    <ul>
        {% for item in res %}
        <li>{{item.name}}</li>
        {% endfor %}
    </ul>
</body>
</html>

设置分页

在班级列表下,增加列表页码。

{# 设置分页页码 #}
<ul>
    {% for index in res.paginator.page_range %}
    <li><a href="{% url 'myapp:grade_list' index %}">{{index}}</a></li>
    {% endfor %}
</ul>

当前页码不可点击

在循环中通过判断分页的当前页码字段,设置当前页码不可点击。

{# 设置分页页码 #}
<ul>
    {% for index in res.paginator.page_range %}
        {% if res.number == index %}
            <li>{{index}}</li>
        {% else %}
            <li><a href="{% url 'myapp:grade_list' index %}">{{index}}</a></li>
        {% endif %}
    {% endfor %}
</ul>

总结

分页的实现就是把封装好的功能,通过对外的入口,传递相应参数就可调用;

实际开发中易于操作方便我们的调用,节省时间。

Django分页原理:获取所有符合条件数据,然后实例化分页对象,最后通过分页对象获取分页数据,返回响应和数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JSON_L

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值