首页 > 其他分享 >Django-分页组件

Django-分页组件

时间:2023-09-11 20:36:45浏览次数:46  
标签:cur self Django num 组件 total 页码 page 分页

在/test_orm/文件夹下新建一个文件夹utils,在其下新建一个paginater.py:

class Paginater():

    def __init__(self, url_address,cur_page_num, total_rows,  one_page_lines=10, page_maxtag=9):
        """
        url_address: 页码标签href的地址,也就是分页功能的网页URL
        cur_page_num: 当前页码数
        total_rows: 数据模型的记录总数
        one_page_lines: 每页显示多少条记录
        page_maxtag: 页面上显示页码标签的个数
        """
        self.url_address = url_address
        self.page_maxtag=page_maxtag

        """
        根据总记录数,计算出总的页数。
        通过divmod()函数取得商和余数,有余数时,总页数是商加上1
        同时判断当前页的数值是否大于总页数,如果大于总页数,设置当前页数等于最后一页的页数
        """
        total_page, remainder = divmod(total_rows, one_page_lines)
        if remainder:
            total_page += 1
        self.total_page = total_page
        try:
            # 参数page传递进来是字符型数值,因此需要转化为整数类型
            cur_page_num = int(cur_page_num)
            # 如果输入的页码数超过了最大的页码数,设置当前页数是最后一页的页数
            if cur_page_num > total_page:
                cur_page_num = total_page
            #避免出现当前页数为0
            if cur_page_num == 0:
                cur_page_num=1
        except Exception as e:
            # 当输入的页码不是正整数时, 设置当前页数是第一页的页数
            cur_page_num = 1
        self.cur_page_num = cur_page_num

        # 定义两个变量,指定表中取出的记录开始数,以及当前页记录结束的位置
        self.rows_start = (cur_page_num - 1) * one_page_lines
        self.rows_end = cur_page_num * one_page_lines
        # 如果页数小于每页设置的页码标签数,设置每页页码标签数为总页数
        if total_page < page_maxtag:
            page_maxtag = total_page
        # 把当前页码标签放在中间,前面放一半页码标签,后面放一半页码标签
        # 因此现把页面上放置的页码标签数除以2
        half_page_maxtag = page_maxtag // 2
        # 页面上页码开始
        page_start = cur_page_num - half_page_maxtag
        # 页面上页码结束
        page_end = cur_page_num + half_page_maxtag
        """
        如果当前页减一半,小于1,页面中页码标签设置从1开始,
        页面中页码标签等页面中页码标签数
        """
        if page_start <= 1:
            page_start = 1
            page_end = page_maxtag
        """
        如果当前页加 一半 比总页码数大,设置最后的页码标签值为总页数
        页面中页码标签起始等于总页数减掉页码标签数加1
        """
        if page_end >= total_page:
            page_end = total_page
            page_start = total_page - page_maxtag + 1
            if page_start <= 1:
                page_start = 1
        self.page_start=page_start
        self.page_end=page_end


    def html_page(self):
        # 初始一个列表变量,用来保存拼接分页的HTML代码
        html_page = []
        # 首页代码
        html_page.append('<li><a href="{}?page=1">首页</a></li>'.format(self.url_address))
        #  上一页页码标签的HTML代码,如果当前是第一页,设置上一页标签为非可用状态
        if self.cur_page_num <= 1:
            html_page.append('<li class="disabled"><a href="#"><span aria-hidden="true">«</span></a></li>'.format(
                self.cur_page_num - 1))
        else:
            # 上一页页码标签的HTML代码
            html_page.append('<li><a href="{}?page={}"><span aria-hidden="true">«</span></a></li>'.format(self.url_address, self.cur_page_num-1))
        # 依次取页码标签,注意切片函数用法
        for i in range(self.page_start, self.page_end + 1):
            # 如果是当前页就加一个active样式类
            if i == self.cur_page_num:
                tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_address, i)
            else:
                tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.url_address, i)
            html_page.append(tmp)

        # 下一页的页码标签的HTML代码
        # 判断,如果是最后一页,就没有下一页
        if self.cur_page_num >= self.total_page:
            html_page.append('<li class="disabled"><a href="#"><span aria-hidden="true">»</span></a></li>')
        else:
            html_page.append('<li><a href="{}?page={}"><span aria-hidden="true">»</span></a></li>'.format(self.url_address, self.cur_page_num+1))
        # 最后一页的页码标签的HTML代码
        html_page.append('<li><a href="{}?page={}">尾页</a></li>'.format(self.url_address, self.total_page))
        # 把HTML联结起来
        page_nav = "".join(html_page)
        return page_nav

    @property
    def data_start(self):
        return self.rows_start

    @property
    def data_end(self):
        return self.rows_end

说明:以上代码通过Paginater类对分页逻辑代码进行了封装,主要包括初始化、生成HTML代码片段、生成两个属性。

类中__init__函数接收URL、当前代码、记录总数、每页显示的记录数、每页页码标签数等参数,计算出总页数、当前页中记录从第几条开始并且到第几条结束,当前页面上的页码标签的开始数和结束数。

类中html_page函数通过__init__接收参数以及计算出的值生成分页相关的HTML代码。

类中data_start、data_end两个函数分别返回当前页面从哪条记录开始、哪条结束,通过@property装饰器变成类属性。

调用分页组件:

# 引入分页组件类
from utils.paginater import Paginater
def person_pagenew(request):
    # 从URL中取参数page,这个参数与pageinanter.py生成的代码片段有关
    cur_page_num = request.GET.get('page')
    if not cur_page_num:
        cur_page_num = '1'
    # 取得person中的记录总数
    total_count = models.person.objects.all().count()
    # 设定每一页显示多少条记录
    one_page_lines = 6
    # 页面上共展示多少页码标签
    page_maxtag = 9
    # 生成Paginater类的实例化对象
    page_obj = Paginater(url_address='/test_page/person_pagenew/',
                         cur_page_num=cur_page_num,total_rows=total_count,one_page_lines=one_page_lines,
                         page_maxtag=page_maxtag)
    # 对person表中的记录进行切片,取出本页的记录。
    page_list=models.person.objects.all()[page_obj.data_start:page_obj.page_end]
    return render(request,'test_page/list_person.html',{'person_list':page_list,'page_nav':page_obj.html_page()})

  

标签:cur,self,Django,num,组件,total,页码,page,分页
From: https://www.cnblogs.com/p4567/p/17694415.html

相关文章

  • Django_debug page_XSS漏洞(CVE-2017-12794)漏洞复现
    目录1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞分析3、漏洞验证说明内容漏洞编号CVE-2017-12794漏洞名称Django_debugpage_XSS漏洞漏洞评级影响范围1.11.5版本漏洞描述修复方案1.1、漏洞描述1.11.5版本,修复了......
  • 最简单的前端分页---思路就是监听分页变化,然后slice数据源
    element版本的背景有些页面显示数据量不大,或者后端分页比较复杂;不考虑性能情况下前端分页不失为比较好的选择。实现技术点:VUE+Element(el-table,el-pagination)DEMO<template><divclass="app-container"><divclass="content"><el-tablev-loa......
  • 百度开源上传组件webuploader
    //上传多文件   functionUploadMultiFile(){       varuploader=WebUploader.create({           //选完文件后,是否自动上传。           auto:true,           //swf文件路径           swf:'~/Cont......
  • Django 测试是否安装成功
    在我们安装好django后,我们不要急于去开发,我们首先要清楚我们的django是否安装成功。在这里要注意:有些童鞋反应安装不成功,大多数原因是:权限问题,当前用户的权限不够。django安装过程中会在/usr/local/lib/中写入文件,所以安装前要确认当前用户有对lib目录的操作权限。这样才能确保成功......
  • django之models
    #字段选项null如果是True,Django将在数据库中存储空值为NULL。默认为False。blank如果是True,该字段允许为空。默认为False。choicesfromdjango.dbimportmodelsclassStudent(models.Model):FRESHMAN='FR'SOPHOMORE='SO'JUNIOR='JR'......
  • vue兄弟组件传参
    实现兄弟组件之间的参数传递可以通过以下方法:使用共同的父组件来传递参数。在父组件中定义一个数据属性,用于保存需要传递给兄弟组件的参数。Copyexportdefault{data(){return{message:'Hello',};},};在父组件的模板中引用两个兄弟组......
  • vue2打包组件发布到npm
    1.使用vuecreateprojectName新建一个项目2.将src的文件夹名称改为example,便于我们调试代码3.增加packages文件夹,其下面的index.js代码如下importpanelfrom'./panel/index.vue'constcomponents=[panel]constinstall=function(Vue){if(install.i......
  • vue项目成功引入element组件的具体步骤
    1、首先要确保vue项目能够成功在浏览器访问2、一般使用的是vue3那么,需要注意的是,element组件在vue3里面,需要使用的是element-plus命令:npminstallelement-plus--save--legacy-peer-deps下载完成之后,需要在main.js里面对element组件进行引入:importElementPlusfrom'ele......
  • Django管理后台访问和登录页面访问数据不一致的问题
    Django管理后台访问和登录页面访问数据不一致的问题问题现象我再创建商品购物车功能后,发现这个功能页面需要放在管理后台。在测试功能时是直接配置路由访问http://localhost:8088/view_cart/是可以正常加载购物车的相关功能的,然后将购物车功能加到管理后台,添加之后发现没有查到......
  • Vue组件传值方法
    使用propsprops是用于向子组件传递数据的一种方式。父组件可以将数据传递给子组件的props属性,子组件则可以通过props来访问这些数据。父组件:<template><div><child-component:message="message"></child-component></div></template>子组件:<template><div>{......