Django学习------分页功能的实现

1 Paginator

Paginator 类的作用是将我们需要分页的数据分割成若干份。当我们实现化一个 Paginator 类的实例时,需要给 Paginator 传入两个参数。第一个参数是数据源,可以是一个列表、元组、以及查询结果集 QuerySet。第二个参数需要传入一个整数,表示每页显示数据条数。具体写法如下:

book_list = []
for x in range(1, 26):  # 一共 25 本书
    book_list.append('Book ' + str(x))
# 将数据按照规定每页显示 10 条, 进行分割
paginator = Paginator(book_list, 10)

上面代码中,我们传入一个名为 book_list 的列表,该列表中含有 25 本书,然后我们给 Paginator 设定每页显示 10 条数据,最后得到一个 Paginator 实例。

另外 Paginator 类中有三个常用的属性,它们分别是:

  • count:表示所有页面的对象总数。
  • num_pages: 表示页面总数。
  • page_range: 下标从 1 开始的页数范围迭代器。

2 Page 对象

Paginator 类提供一个page(number) 函数,该函数返回就是一个 Page 对象。参数 number 表示第几个分页。如果 number = 1,那么 page() 返回的对象是第一分页的 Page 对象。在前端页面中显示数据,我们主要的操作都是基于 Page 对象。具体用法如下:

# 使用  paginator 对象返回第 1 页的 page 对象
books = paginator.page(1)

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 异常。

3 案例

3.1、views.py

用数组模拟数据

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
from django.core.paginator import Paginator
from django.shortcuts import render


def test_page(request):
    page_num = request.GET.get('page',1)
    all_data = ['a','c','b','d','g','h']
    #初始化paginator
    paginator = Paginator(all_data,2)
    #初始化具体页码page对象
    c_page = paginator.page(int(page_num))
    return render(request,'test_page.html',locals())

3.2、test_page.html

<!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={{ 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 %}
</body>
</html>

不要忘记配置路由

 path('test_page', views.test_page),

4 效果演示

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

韭菜盖饭

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

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

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

打赏作者

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

抵扣说明:

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

余额充值