Django笔记--python实现将分页功能封装成类

2023-11-09

Django笔记–python实现将分页功能封装成类

对于数据的表格形式呈现,庞大的数据量不可能全部放在一页中(除非数据很少)。所以基本上都需要用到分页功能。因此有必要将分页功能封装成一个类,方便使用。


pagination.py(将分页功能分装到Pagination类中)

from django.utils.safestring import mark_safe
from django.http import QueryDict
#分页器
class Pagination:
    def __init__(self,request,all_count,query_params=QueryDict(),per_num=10,max_show=11):  #接受一个request对象(request)与int类型的总数据量(all_count)
        '''
        base_url:路径
        all_count: 总数据量
        per_num: 每页的数据量(默认值为10)
        max_show: 每页显示的页码数(默认值为11)
        total_num:总页码数
        current_page:当前页码
        page_start:当前页面的第一个页码数
        page_end:当前页面的最后一个页码数
        query_params:url中的额外参数(这边指的是搜索条件)
        '''
        self.base_url = request.path_info #获取路径
        self.max_show = max_show          #获取每页显示页码数
        self.per_num = per_num            #获取每页的数据量
        self.all_count = all_count        #获取总数据量
        self.query_params = query_params  #url中额外的搜索参数
        half_show = max_show // 2
        self.total_num, more = divmod(all_count, per_num)  #通过总数据量除每页数据量来获取总页码数与剩余数据量
        try:  #异常处理,获取当前页码
            self.current_page = int(request.GET.get('page', 1))
            if self.current_page <= 0:
                self.current_page = 1
        except Exception as e:
            self.current_page = 1

        if more:   #如果剩余数据量不为0,则总页码数加1
            self.total_num += 1

        if self.total_num <= max_show:  #总页码数小于最大显示页码数
            self.page_start = 1
            self.page_end = self.total_num
        else:                           #总页码数大于最大显示数
            if self.current_page <= half_show:   #特殊情况(当前页码 - 每页显示页码数的一半 < 1)
                self.page_start = 1
                self.page_end = max_show
            elif self.current_page >= self.total_num:  #特殊情况(当前页码 + 每页显示页码数的一半 > 总页码数)
                self.page_start = self.total_num - max_show + 1
                self.page_end = self.total_num
            else:         #正常情况
                self.page_start = self.current_page - half_show
                self.page_end = self.current_page + half_show

    def start(self):
        #返回当前页码的第一个数据的索引
        return (self.current_page - 1) * self.per_num

    def end(self):
        #返回当前页码的最后一个数据的索引
        return self.current_page * self.per_num

    def show_li(self):
        #返回关于html的字符串(返回<li><a>标签)
        '''
        html_list:暂时存放html字符串的列表
        first_li:关于“首页”的html字符串(直接跳转第一页的功能)
        prev_li:关于“<<”的html字符串(上一页的功能)
        li_html:关于页码显示的html字符串(页面跳转)
        next_li:关于“>>”的html字符串(下一页的功能)
        last:关于“尾页”的html字符串(直接跳转最后一页的功能)
        '''
        html_list = []

        self.query_params['page'] = 1    #在url的二外参数中添加page

        #首页
        first_li = '<li><a href="{0}?{1}">首页</a></li>'.format(self.base_url,self.query_params.urlencode())
        html_list.append(first_li)

        #<<上一页
        if self.current_page == 1:
            prev_li = '<li class="disabled"><a><<</a></li>' #当上一页超过第一页,则设置不可点击disabled
        else:
            self.query_params['page']=self.current_page - 1    #在url的二外参数中添加page
            prev_li = '<li><a href="{0}?{1}"><<</a></li>'.format(self.base_url,self.query_params.urlencode())
        html_list.append(prev_li)

        #显示的页码
        for num in range(self.page_start, self.page_end + 1):
            self.query_params['page'] = num     #在url的二外参数中添加page
            if self.current_page == num:   #当页码为当前页码数,则设置选中状态active
                li_html = '<li class="active"><a href="{0}?page={1}">{2}</a></li>'.format(self.base_url,self.query_params.urlencode(),num)
            else:
                li_html = '<li><a href="{0}?page={1}">{2}</a></li>'.format(self.base_url,self.query_params.urlencode(),num)
            html_list.append(li_html)

        #>>下一页
        if self.current_page == self.total_num:
            next_li = '<li class="disabled"><a>>></a></li>'   #当下一页超过总页码数,则设置不可点击disabled
        else:
            self.query_params['page'] = self.current_page + 1     #在url的二外参数中添加page
            next_li = '<li><a href="{0}?page={1}">>></a></li>'.format(self.base_url,self.query_params.urlencode())
        html_list.append(next_li)

        #尾页
        self.query_params['page'] = self.total_num     #在url的二外参数中添加page
        last_li = '<li><a href="{0}?{1}">尾页</a></li>'.format(self.base_url,self.query_params.urlencode())
        html_list.append(last_li)

        return mark_safe(''.join(html_list))   #将列表拼接,返回字符串

后面的视图函数与html页面就列出部分,举个例子:

views.py(视图函数)

from pagination import Pagination
def customer_list(request):
    all_customer = models.Customer.objects.all()   #从数据库中获取数据
    page = Pagination(request, all_customer.count())   #实例化对象
    return render(request, 'crm/uesr_list.html', {'all_customer':all_customer[page.start():page.end()],'pagination':page.show_li()})  #返回HTML页面

user_list.html(html页面)

<table class="table table-bordered">
        <thead>
        <tr>
            <th>序号</th>
            <th>用户名</th>
            <th>学号</th>
        </tr>
        </thead>
        <tbody>
        {% for user in data %}
            <tr>
                <td>{{ forloop.counter }}</td>
                <td>{{ user.name }}</td>
                <td>{{ user.number }}</td>
            </tr>
        {% endfor %}
        </tbody>
    </table>

    <div style="text-align: center">
        <nav aria-label="Page navigation">
            <ul class="pagination">
                {{ html_str }}
            </ul>
        </nav>
    </div>

效果图:(简单展示功能)
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

END!笔记就记录到此。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django笔记--python实现将分页功能封装成类 的相关文章

  • 嵌套函数中的变量作用域

    有人可以解释为什么以下程序失败 def g f for in range 10 f def main x 10 def f print x x x 1 g f if name main main 带有消息 Traceback most re
  • 用于读取类似 CSV 行的 Python 正则表达式

    我想解析传入的类似 CSV 的数据行 值用逗号分隔 逗号周围可能有前导和尾随空格 并且可以用 或 引用 例如 这是有效的行 data1 data2 data3 data4 data5 但这是格式错误的 data1 data2 da ta3
  • 如何搜索一列并用找到的内容填充另一列?

    我有一个带有虚构人物数据的大熊猫数据框 下面是一个小例子 每个人都由一个数字定义 import pandas as pd import numpy as np df pd DataFrame Number 5569 3385 9832 64
  • Python SQLite3 SQL注入漏洞代码

    我知道下面的代码片段由于 format 的原因很容易受到 SQL 注入的攻击 但我不知道为什么 有谁明白为什么这段代码容易受到攻击以及我从哪里开始修复它 我知道这些代码片段使输入字段保持打开状态 以便通过 SQL 注入执行其他恶意命令 但不
  • Python MySQLdb:connection.close() VS。光标.close()

    如果我使用MySQLdb通过Python连接到MySQL Server 我创建一个connection and a cursor像这样 connection MySQLdb connect cursor connection cursor
  • Plotly:如何设置文本格式(下划线、粗体、斜体)

    使用注释时 我尝试在绘图中为文本添加下划线 我使用添加注释 import plotly graph objects as go g go FigureWidget make subplots rows 1 cols 1 g update l
  • 在 Python 中引发异常的正确方法是什么? [复制]

    这个问题在这里已经有答案了 这是简单的代码 import sys class EmptyArgs StandardError pass if name main The first way to raise an exception if
  • 如何在使用 Flask for Python 3 的同时使用 Bootstrap 4?

    我检查过 发现默认安装时 Flask Bootstrap 原生使用 Bootstrap 3 3 7 但实际上我想通过使用 Flask Bootstrap 包在我的项目中使用 Bootstrap 4 任何有关如何更新它或类似内容的帮助将不胜感
  • 在添加数据之前使用 Python gdata 清除工作表中的行

    我有一个 Google 电子表格 我使用 python 脚本和 gdata 库填充值 如果我多次运行脚本 它会将新行附加到工作表中 我希望脚本在填充之前首先清除行中的所有数据 这样每次运行时我都会有一组新的数据脚本 我尝试过使用 Updat
  • 在 Keras 中使用有状态 LSTM 训练多变量多级数回归问题

    我有时间序列P过程 每个过程的长度各不相同 但都有 5 个变量 维度 我试图预测测试过程的估计寿命 我正在用有状态的方法来解决这个问题LSTM在喀拉斯 但我不确定我的训练过程是否正确 我将每个序列分成长度的批次30 所以每个序列都是这样的形
  • 配置 Django 和 Google 云存储?

    I am not使用应用引擎 我有一个在虚拟机上运行的普通 Django 应用程序 我想使用 Google Cloud Storage 来提供静态文件 以及上传 提供媒体文件 我有一个水桶 如何将 Django 应用程序链接到我的存储桶 我
  • 如何读取多个文件并将它们合并到一个 pandas 数据框中?

    我想读取位于同一目录中的多个文件 然后将它们合并到一个 pandas 数据框中 如果我这样做的话它会起作用 import pandas as pd df1 pd read csv data 12015 csv df2 pd read csv
  • 如何在Python中不使用库函数将字符串转换为整数?

    我正在尝试转换 a 546 to a 546 不使用任何库函数 我能想到的 最纯粹 gt gt gt a 546 gt gt gt result 0 gt gt gt for digit in a result 10 for d in 01
  • 在一个视图中使用两个模板

    我尝试以两种方式呈现视图中的内容 html 和 csv 下载 我能够做到这一点的唯一方法是使用两种不同的视图 一种用于 html 演示 一种用于 csv 这重复了我的代码 我正在寻找更优雅的解决方案 有什么建议么 这是示例代码 views
  • Django admin:通过 URL 传递变量

    我想通过 URL 将变量传递到 django admin 中的另一个页面 看起来它不起作用 我想传递变量 name hello 并通过request GET get name 捕获它 但是url变成 e 1 经过之后 如果我使用默认参数 q
  • 无法将 librosa 与 python 3 一起使用

    我已经在 Windows 上的 ubuntu 子系统上使用 pip3 正确安装了 librosa 但是当我尝试执行像这样的简单程序时 import librosa data sr librosa load sound mp3 print d
  • Docker Python 脚本找不到文件

    我已经成功构建了一个 Docker 容器 并将应用程序的文件复制到 Dockerfile 中的容器中 但是 我正在尝试执行引用输入文件 在 Docker 构建期间复制到容器中 的 Python 脚本 我似乎无法弄清楚为什么我的脚本告诉我它无
  • Python 中的可逆 STFT 和 ISTFT

    有没有通用的形式短时傅立叶变换 https en wikipedia org wiki Short time Fourier transform与内置于 SciPy 或 NumPy 或其他什么中的相应逆变换 这是pyplotspecgram
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用
  • 如何从 Pandas 数据框函数调用中回顾之前的行?

    我正在研究 回测交易系统 我有一个包含 OHLC 数据的 Pandas 数据框 并添加了几个计算列 https stackoverflow com questions 12376863 adding calculated columns t

随机推荐

  • Bug的级别,按照什么划分

    Bug分类和定级 一 bug的定义 二 bug的类型 三 bug的等级 四 bug的优先级 一 bug的定义 一般是指不满足用户需求的则可以认为是bug 狭义指软件程序的漏洞或缺陷 广义指测试工程师或用户提出的软件可改进的细节 或与需求文档
  • CodePush 私有化部署

    安装 NodeJs 和 Npm 下载安装 NodeJs 安装 nodejs wget https nodejs org dist v6 9 4 node v6 9 4 tar gz configuremakemake install 安装
  • SIM卡与IEC 7816

    SIM卡与IEC 7816 SIM Subscriber Identification Module 又被称为用户身份识别卡 智能卡 SIM卡是一种物理载体 而相关的性能以及协议的规定都包含在IEC 7816协议中 IEC 7816规范 物
  • HJ103 Redraiment的走法 —— 华为机考练习题

    一 题目 描述 Redraiment是走梅花桩的高手 Redraiment可以选择任意一个起点 从前到后 但只能从低处往高处的桩子走 他希望走的步数最多 你能替Redraiment研究他最多走的步数吗 数据范围 每组数据长度满足 1 le
  • ag-grid-vue的配置

    public get gridOptions GridOptions const that this return headerHeight 30 表头高度 rowHeight 30 行高 columnDefs 列定义 headerName
  • 常用JS对象的方法总结

    String 方法 描述 charAt 返回在指定位置的字符 charCodeAt 返回在指定的位置的字符的 Unicode 编码 concat 连接字符串 indexOf 检索字符串 match 找到一个或多个正则表达式的匹配 repla
  • spring的后处理

    什么是spring的后处理器 spring的后处理是spring对开开发的重要扩展点 bean的许多的功能的增强就是通过后处理实现的 他可以允许我们产于到bean的实例化路程中去 两类后处理器 根据我们对于bean的实例化的认识 我们知道b
  • C中调用带参数的exe并接收返回值

    test exe c sharp view plain copy include
  • 高等数学知识点总结

    高等数学知识点总结 一 间断点 定义 1 f x 在处没有定义 则为间断点 2 f x 在处有定义 但是极限不存在 3 f x 在处有定义 极限也存在 但是不相等 分类 第一类间断点 左右极限都存在 1 可去间断点 2 跳跃间断点 第二类间
  • Android Service

    http www cnblogs com lwbqqyumidi p 4181185 html Service通常总是称之为 后台服务 其中 后台 一词是相对于前台而言的 具体是指其本身的运行并不依赖于用户可视的UI界面 因此 从实际业务需
  • 微信小程序使用wxParse解析html

    转 http www jianshu com p 3de027555e77 最近项目上遇到在微信小程序里需要显示新闻内容 新闻内容是通过接口读取的服务器中的富文本内容 是html格式的 小程序默认是不支持html格式的内容显示的 那我们需要
  • 内存管理<原理篇>(四、分段和分页)

    文章目录 4 1 分段 4 1 1 程序段介绍 4 1 2 各段放入内存信息 4 1 3 段表 4 1 4 总结 4 2 分页 4 2 1 概念介绍 4 2 2 各段加载进内存 4 2 3 例子分析 4 2 4 总结 4 1 分段 在上一篇
  • python 使用 passlib 库在 windows 平台实现 crypt

    今天同步代码的时候 发现别的同事往项目里新加了一行 import crypt 编译器提示有错 我就去检查了项目的requirements文件 但没找到新的依赖 然后我google了一下 原来这个文件是Unix 系统用来给密码加密的文件 并不
  • Coding pages 不见了

    Coding pages 不见了 起因 因为自己的这个博客 有时候访问还是比较慢的 原因是我的代码是在GitHub上托管的 GitHub是国外的网站 服务器都在国外 所以访问速度就特别慢 我就想找国内的既能实现代码托管 又能生成静态网页的平
  • Java实现方法中基本类型参数按地址传递

    参考了网上的一些资料 自己总结了一下 详细的可以去以下的博主看看 https www cnblogs com lixiaolun p 4311863 html http blog csdn net maoyeqiu article deta
  • 白话机器学习-Transformer

    一 背景 大抵是去年底吧 收到了几个公众号读者的信息 希望能写几篇介绍下Attention以及Transformer相关的算法的文章 当时的我也是满口答应了 但是确实最后耽误到了现在也没有写 前一阵打算写这方面的文章 不过发现一个问题 就是
  • 一组整数的全排列【C程序】

    include iostream using namespace std int myfactorial int n int i factorial i 1 factorial 1 while i lt n factorial factor
  • Yii Framework 开发教程(10) UI 组件 自定义组件

    在介绍Yii内置UI组件之前 先介绍一下如何自定义组件 这样也有助于理解CWidget的用法 自定义组件就是重载 CWidget的init 和 run 方法 php view plain copy print class MyWidget
  • CSS —— html 自动换行

    涉及三个属性 white space 规定如何处理空白 是否换行 默认值 normal 超出时自动换行 word wrap normal 默认 只在内容的断点换行 即不能断开单词 或 break word 长单词内也可换行 word bre
  • Django笔记--python实现将分页功能封装成类

    Django笔记 python实现将分页功能封装成类 对于数据的表格形式呈现 庞大的数据量不可能全部放在一页中 除非数据很少 所以基本上都需要用到分页功能 因此有必要将分页功能封装成一个类 方便使用 pagination py 将分页功能分