Django框架(九、分页功能)

Django分页功能 文章目录前言一、分页相关类及函数介绍二、使用步骤1.引入库2.读入数据总结 前言 分页是网站数据展示不可缺少的一部分,Django作为一个大而全的框架。自然已为开发者提供了内置分页功能 一、分页相关类及函数介绍 Paginator类一共定义了2个必选参数,2个可选参数,8个类方法 Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True) 参数介绍: object_list:必选,需要进行分页处理的数据。常为列. 阅读详情

一、Django分页功能

1.Paginator对象

方法描述
per_page每页显示条目数量
count数据总个数
num_pages总页数
page_range总页数的索引范围,如: (1,10),(1,200)
pagepage对象

2.page对象

方法描述
has_next是否有下一页
next_page_number下一页页码
has_previous是否有上一页
previous_page_number上一页页码
object_list分页之后的数据列表
number当前页
paginatorpaginator对象

3.内置分页功能

views.py文件

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

User_list = []
for i in range(1,101):
    item = {"user"+str(i):i}
    User_list.append(item)


def index1(request):
    current_page = request.GET.get("p")
    paginator = Paginator(User_list, 10)
    try:
        # 这里将page对象定于为 ports
        ports = paginator.page(current_page)
    except PageNotAnInteger:
        ports = paginator.page(1)
    except EmptyPage:
        ports = paginator.page(paginator.num_pages)
    return render(request,"index1.html", {"ports":ports})
views.py

index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

    </style>
</head>
<body>


{% for user in ports.object_list %}
    <ul>{{ user }}</ul>
{% endfor %}

<div>
    {% if ports.has_previous %}
        <a href="/index1.html/?p={{ ports.previous_page_number }}">上一页</a>
        {% else %}
        <a href="#">首页</a>
    {% endif %}
    
    {% if ports.has_next %}
        <a href="/index1.html/?p={{ ports.next_page_number }}">下一页</a>
        {% else %}
        <a href="#">尾页</a>
    {% endif %}
</div>


</body>
</html>

在这里插入图片描述
Django内置的分页功能就只能做到这些事情,但这远远不能满足我们的需求,那么我们就需要对Django分页功能进行补充了。

二、Django分页功能的补充

  • 类Paginator是由Django内置的一个分页功能,但它能够完成的功能有限,那么我们就需要对其进行补充了。
  • 我们自定义CustomPaginator类,该类继承Paginator

扩展内置分页:views.py

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


class CustomPaginator(Paginator):
    def __init__(self, current_page, max_pager_num, *args, **kwargs):
        """
        :param current_page: 当前页
        :param max_pager_num:最多显示的页码个数
        :param args:
        :param kwargs:
        :return:
        """
        self.current_page = int(current_page)
        self.max_pager_num = max_pager_num
        super(CustomPaginator, self).__init__(*args, **kwargs)

    def page_num_range(self):
        # 当前页面
        # self.current_page
        # 总页数
        # self.num_pages
        # 最多显示的页码个数
        # self.max_pager_num
        print(1)
        if self.num_pages < self.max_pager_num:
            return range(1, self.num_pages + 1)
        print(2)
        part = int(self.max_pager_num / 2)
        if self.current_page - part < 1:
            return range(1, self.max_pager_num + 1)
        print(3)
        if self.current_page + part > self.num_pages:
            return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1)
        print(4)
        return range(self.current_page - part, self.current_page + part + 1)


L = []
for i in range(999):
    L.append(i)

def index(request):
    current_page = request.GET.get('p')
    paginator = CustomPaginator(current_page, 11, L, 10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    return render(request, 'index.html', {'posts': posts})


扩展内置分页:Html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

    </style>
</head>
<body>
<div>
    <a href="/index1.html/?p=1">首页</a>
    {% if ports.has_previous %}
        <a href="/index1.html/?p={{ ports.previous_page_number }}">上一页</a>


    {% endif %}

    {% for foo in ports.paginator.page_num_range %}
        {% if foo ==  ports.number %}
            <a href="/index1.html/?p={{ foo }}" style="font-size: 30px;color: red">{{ foo }}</a>
            {% else %}
            <a href="/index1.html/?p={{ foo }}">{{ foo }}</a>
        {% endif %}


    {% endfor %}

    {% if ports.has_next %}
        <a href="/index1.html/?p={{ ports.next_page_number }}">下一页</a>

    {% endif %}
    <a href="/index1.html/?p={{ ports.paginator.num_pages }}">尾页</a>
    <span>{{ ports.number }}/{{ ports.paginator.num_pages }}</span>

</div>
</body>
</html>

扩展内置分页:Html

通过该分页功能大致实现的效果
在这里插入图片描述

三、自定制插件式分页功能

除了用系统提供的,我们可以自定义一个插件功能,这样的话,我们只需要将这个py文件保存在我们电脑的硬盘中,在我们需要时,调用就可以实现分页了,同时在定制时,还能为分页设置好样式。
在这里我们使用BootStrap来对我们的样式进行美化。

views.py文件

def index(request):
    from app.pager import Pagination
    current_page = request.GET.get("p")
    print(current_page)
    page_obj = Pagination(total_count=len(User_list),
                     current_page=current_page)
    print(page_obj.num_pages)
    data_list = User_list[page_obj.start():page_obj.end()]
    return render(request,"index.html",{"data_list":data_list,"page_obj":page_obj})

插件page.py文件


""""
配合插件 Bootstrap
"""

class Pagination(object):
    def __init__(self,total_count,current_page,per_page_num=20,max_page_num=7):
        """

        :param total_count: 所有数据的个数
        :param current_page:  当前页码
        :param per_page_num:  每页显示记录个数
        :param max_page_num:  分页现在最多页码个数
        """
        self.total_count=total_count
        try:
            self.current_page=int(current_page)
            if self.current_page < 1:
                self.current_page = 1
        except Exception as e:
            self.current_page = 1
        self.per_page_num=per_page_num
        self.max_page_num=max_page_num

    # 数据的索引首地址
    def start(self):
        return (self.current_page-1)*self.per_page_num

    # 数据的索引为地址
    def end(self):
        return (self.current_page)*self.per_page_num

    @property
    def num_pages(self):
        """

        :return: 总页数
        """
        a,b = divmod(self.total_count,self.per_page_num)
        if self.per_page_num == 0:
            return a
        return a+1

    def page_num_range(self):
        """
        自定义分页功能
        :return:  返回值是一个数组,该数组表示的是分页显示的页码
        """
        part = int(self.max_page_num/2) # 分页个数的中间值

        # 当页码总数小于显示分页数目时,所有页码显示
        if self.num_pages <= self.max_page_num:
            return range(1, self.num_pages+1)
        elif self.num_pages > self.max_page_num:
            # 当前页码小于分页的总数的中间值时,显示前几位分页页码
            if self.current_page<=part:
                return range(1,self.max_page_num+1)
            # 当前页码+中间值时大于总页码,显示后几位分页页码
            elif self.current_page+part>=self.num_pages:
                return range(self.num_pages - self.max_page_num + 1, self.num_pages + 1)
            # 显示需要显示的页码个数,并将当前页码居中
        return range(self.current_page-part,self.current_page+part+1)

    def page_str(self):
        """

        :return:  返回值是一个html格式的字符串,返回到前端直接调用就可以显示页码。运用的是插件Bootstrap
        """
        page_list = []

        # 首页按钮
        first_page = "<ul class='pagination'> <li ><a href='/index.html/?p=1'>首页</a></li>"
        page_list.append(first_page)

        # 如果存在上一页才有上一页按钮
        if self.current_page>1:
            prep_page = "<li><a href='/index.html/?p=%s'>上一页</a></li>"%(self.current_page-1)
            page_list.append(prep_page)

        # 中间序列的页码按钮
        for i in self.page_num_range():
            if i == self.current_page:
                temp = "<li class='active'><a href='/index.html/?p=%s' >%s</a></li>"%(i,i)
            else:
                temp = "<li><a href='/index.html/?p=%s' >%s</a></li>"%(i,i)
            page_list.append(temp)

        # 如果存在下一页才有下一页按钮
        if self.current_page< self.num_pages:
            next_page =  "<li><a href='/index.html/?p=%s'>下一页</a></li>"%(self.current_page+1)
            page_list.append(next_page)

        # 尾页按钮
        last_page = "<li><a href='/index.html/?p=%s'>尾页</a></li>  </ul>"%(self.num_pages)
        page_list.append(last_page)
        return " ".join(page_list)



index.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/plugin/bootstrap/css/bootstrap.css">
    <style>
        * {
            padding: 0;
            margin: 0;
        }

    </style>
</head>
<body>


{% for row in data_list %}
    <ul>{{ row }}</ul>
{% endfor %}

<hr>
{% for current_page in page_obj.page_num_range %}
    <a href="/index.html/?p={{ current_page }}">{{ current_page }}</a>

{% endfor %}
<hr>
{{ page_obj.page_str | safe }}

</body>
</html>

通过该自定义插件,我们可以对比出,渲染后的区别
在这里插入图片描述

Django实现分页功能 在本节中,我们将介绍 Django 为我们提供的高级模块,通过高级模块的学习,你会感受到 Django 的易用性如此之强,但是同时它又很复杂,所以在学习 Django 这样的重度框架的时候,我们一定要切记急躁,对于新的知识要敢于探索,除了要跟随着本教程的进度学习之外,大家也要拿出时间多阅读 Django 源码、官方文档,这样才能帮助自己尽快的提升。 本节要讲的分页功能大家一定不陌生,就像课本上的一篇篇课文一样,如果课文内容很多就会分成很多页,展示给读者。这和我们在开发阶段处理数据信息是一样的,因为大多数情况 阅读详情

相关推荐

django 分页功能的实现

我是参考了这位大神(http://www.cnblogs.com/kongzhagen/p/6640975.html)的文章后自己写的,因为大神的文章中url没有写,另外在写完后页面虽然分页了,但是没有数据显示,那分页了就没什么用了,所以自己弄了下,将这两个问题都搞好了 views 代码: from django.core.paginator import Paginator, Empty

Aochen的博客 6202

Django 模型操作-分页(七)

Django 模型操作-分页

分享我的点点滴滴,在成长路上与你同行! 1000

FLASK框架之分页

直接上干货 这是分页的视图函数 @app.route(’/stupage’) def stu_page(): # 获取页面传过来的页数 page = int(request.args.get('page',1)) # 如没获取到 默认给个第一页 # 给每页分多少条数据 这里是每页显示2条 per_page = int(request.args.get('per_page',2)) #分页需要...

墨茶Official 愿你在二次元有吃不完的草莓 饺子(ㄒoㄒ) 2699

Django分页器

在页面显示分页数据,需要用到Django分页器组件Paginator对象: paginator = Paginator(user_list, 10)# per_page: 每页显示条目数量# count: 数据总个数# num_pages:总页数# page_range:总页数的索引范围,如: (1,10),(1,200)# page: page对象page对象:page=paginator.page(1)# has_next 是否有下一页# next_page_number 下一页页码。

m0_71115526的博客 810

Django实现分页的方法

通过这种方法,我们可以轻松地实现分页功能,提高用户体验和页面加载速度。在Django中,实现分页功能非常简单,本文将介绍一种常见的方法。如果有下一页,我们将显示一个指向下一页的链接。假设我们已经完成了这些准备工作,接下来我们将重点关注如何实现分页功能。接下来,我们设置了每页显示的数据数量为10,并使用。至此,我们已经完成了Django中分页功能的实现。是我们在视图函数中传递给模板的分页对象。然后,我们从请求的GET参数中获取当前页码,并使用。在上述模板中,我们使用了Django的模板语法。

HackNebulaZ的博客 229

11.django框架分页器

分页,就是当我们在页面中显示一些信息列表,内容过多,一个页面显示不完,需要分成多个页面进行显示时,使用的技术就是分页技术。在diango项目中,一般是使用3种分页的技术:1. 自定义分页功能,所有的分页功能都是自己实现2. django的插件 djange-pagination 实现3.diango自带的分页器 paginator。

qq_40758339的博客 767

Django入门学习__Page对象

创建对象Paginator对象的page()方法返回Page对象,不需要手动构造属性object_list:当前页上所有对象的列表number:当前页的序号,从1开始paginator:当前page对象相关的Paginator对象方法has_next():如果有下一页返回Truehas_previous():如果有上一页返回Truehas_other_pages():如果有下一页或上一页返回Tru...

weixin_40949438的博客 759

海思Hi3516平台集成IMX214 Sensor实战:从I2C调试到VI通路构建

本文详细记录了在海思Hi3516平台上集成索尼IMX214图像传感器的完整实战过程。从硬件I2C通讯调试、驱动层适配,到上层VI通路构建与ISP配置,提供了系统性的排查步骤与代码修改要点,旨在帮助开发者快速打通从Sensor到屏幕的完整视频采集链路,解决集成过程中的常见问题。

tcp8optimizer的博客 596

Python——Django框架(九)、Django内置分页组件、分页拓展、自定义分页

Python——Django框架(九)、Django内置分页组件、分页拓展、自定义分页 参考博客:https://www.cnblogs.com/wupeiqi/articles/5246483.html 一、Django自带的分页组件 1、前期准备与URL控制分页 首先是路由这块,re_path 带的正则表达式应该这么写: 为了以后分页,路由带了数字的前期准备。 然后举个例子: 结果: 数量很多很多,这时候就需要分页。 如果在地址栏上这么写: 意思为看第一页,那么这样: 可以获取 p 等于几,比

qq_41824825的博客 1620

如何打开本地网络的防火墙端口(Windows版)解决ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。问题

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。 最开始在遇到这个报错的时候十分不解,后来经过思考,有可能是服务器端口占用,或者并没有放行。因此搜查问题的关键是要先去排查问题。 在搜索栏输入控制面板 选择防火墙 选择开关 保证这些选项是开着的 选择高级设置 新建规则 创建协议端口 选择端口 允许连接 点击下一步 创建规则后点击下一步(后命名) 选择任意端口ALL即可 问题排查完毕!socket创建网络通信时,有读者

weixin_46900108的博客 9万+

linux系统下XDMA驱动的安装与测试问题总结

先看两个常见的问题。一个是驱动安装问题,一个是驱动测试错误;error 512 能识别PCIE的设备,但是The kernel modle installed correctly, but no devices were recognized.

whm128的博客 3802

django:分页

一,什么是分页 网页是用户与网站进行交互的主要场所,这种交互主要指数据收集与数据展示。 从试想一下,为什么我们几乎不在网页中一次性展示请求获得的所有数据呢? 如果这个数据量相当小,比如只有几十条,那么一般情况下无需担心,一股脑渲染到页面中就行。 但如果这个数据量比较大,比如几百几千几万条,且一旦这种操作比较频繁,显然就会增加服务器负载,主要瓶颈是数据库。 这里不谈如何实现高并发,只谈如何以轻量化的方式获取并展示数据。 一种有效的方式就是实现分页查询:将一次性获取所有数据的操作,分解为多次查询操作,每次操作只

dangfulin的博客 6273

【全覆盖算法】栅格地图实现布氏单元分解算法+栅格地图实现牛耕Boustrophedon Cellular Decomposition Path Planning

本文先对做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 282

Django之分页功能

Django之分页功能 Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭代的对象。 基本语法 class Paginator(object): def __init__(self, object_list, per_page, orphans=0, allow...

PyTtCcMm的博客 451

基于Simulink的电机功率因数校正仿真

PF=SP​=视在功率有功功率​=cosϕ⋅Irms​I1​​(非正弦时)位移因数(cosϕ):基波电压电流相位差畸变因数(I1​/Irms​):谐波导致电流有效值增大本文带你完成了电机系统功率因数校正的Simulink仿真,实现了:✅ 理解了低功率因数的成因与危害✅ 搭建了无PFC、无源PFC、有源PFC三种对比模型✅ 掌握了Vienna整流器建模与dq解耦控制方法✅ 实现了PF与THD的自动计算与评估✅ 验证了有源PFC在PF、THD、稳定性上的全面优势。

amy_mhd的博客 154

【K210+STM32项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(更新3.0版本)(完整工程资料源码)

STM32F407STM32F407_2(含有app功能)

嵌入式技术开发 2490

使用Django实现分页功能

上一个博客写了个简单的留言板,如果数据量太多的话在一页显示就不那么友好了,本文就是做一个分页显示。代码在上一篇的基础上修改。导入分页模块并修改views#只需修改index函数即可def index(request): messages = models.Message.objects.all() #获取全部数据 limit = 10 paginator = Paginat

Yort 5276

【Docker】完美解决拉取镜像超时报错:ERROR: Get https://registry-1.docker.io/v2/

因为我们下载的镜像是外网的镜像资源,所以下载的速度会非常的慢,甚至大概率下载时会报错,所以需要我们配置一个国内的服务器镜像地址,国内服务器镜像地址有很多,这里咱们就说一下阿里镜像加速器的配置方法。

liu_chen_yang的博客 12万+

Python Django实现layui风格+django分页功能

Python Django实现layui风格+django分页功能

Luzaofa的博客 6850

YOLOv11改进策略【SPPF】| AIFI : 基于Transformer的尺度内特征交互,在降低计算成本的同时提高模型的性能

本文记录的是基于AIFI模块的YOLOv11目标检测改进方法研究。AIFI是RT-DETR中高效混合编码器的一部分,利用其改进YOLOv11模型,

Limiiiing的博客 2239

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Django框架之分页器使用

当我们需要使用到非django内置的第三方功能或者组件代码的时候,我们一般情况下会创建一个名为utils文件夹,在该文件内对模块进行功能性划分。utils可以在每个应用下创建。我们到了后期封装代码的时候,不再局限于函数,还是尽量朝面向对象去封装我们自定义的分页器"""封装分页相关数据:param current_page: 当前页:param all_count: 数据库中的数据总条数:param per_page_num: 每页显示的数据条数。

Xiao20000101的博客 1050

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Django 使用Paginator分页器

Django中的Paginator是一个用于分页查询结果的工具,它允许您将大量的数据分割成小块,以便更容易在Web页面上进行展示和浏览。Paginator通常与Django的视图(View)结合使用,以支持分页功能。Paginator是Django框架中用于分页的类。它允许您将大量数据划分成小块,以便更好地展示在Web页面上,同时提供了简单而强大的分页功能。

微软技术分享 9895

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

django paginator 分页功能

转自:https://blog.youkuaiyun.com/weixin_42077001/article/details/81007127 Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭代的对象。 基本语法 class Paginator(object): def __init__(self, ob...

1027

Django:简单实现分页与搜索功能

假设现有需求如下: 需要一个页面分页展示信息,在该页面添加搜索框以提供检索功能。 那么,我们知道,展示信息和检索功能是在同一个页面,也就是共用一个路由。 代码如下: 第一步,写路由:为了清晰,这里只给出主页和展示页面的路由。 urls.py: from django.urls import path from . import views from django.conf.urls....

s_kangkang_A的博客 3656

小白IT:Django框架—分页器paginator

文章目录一、Django内置paginator分页器1.数据准备models.py文件创建表类在views外使用Django环境创建数据2.paginator对象常用属性和方法paginator对象属性paginator对象的方法page_obj对象的方法3.Django分页器实现分页视图函数部分分页后的前端页面二、自定义分页器CustomerPaginator1.为什么使用自定义分页器2.自定义分页器实例自定义分页器组件自定分页组件使用1.分页器使用2.具体使用实例后端views视图前端使用分页器效果图如

yidianyidei的博客 982
上一篇: python全栈开发基础知识学习——Django框架(七、Cookie+Session操作)
下一篇: Django框架(十、文件上传)
Dim_Jerry
博客等级 码龄8年 14粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值