Django框架下的增强分页组件

本文通过文章同步功能推送至博客园,显示排版可能会有所错误,请见谅!

描述:Django框架内置了分页功能,但其只能满足简单需求,难以实现复杂功能。

实现代码:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__auth__ = ‘Song Wei‘

from django.utils.safestring import mark_safe
from math import ceil

class Paginator:
    ‘‘‘自定制分页功能,支持设置标签属性,支持展示页码,支持保留其他GET参数,支持页面跳转后元素定位。
    相关可用属性如下:
        start   获取数据起始位置
        end     获取数据结束位置
        prvePage    上一页页码
        nextPage    下一页页码
        maxPage     总页码
        pvreCode    上一页显示文字
        nextCode    下一页显示文字
        attr        获取普通标签属性
        current_attr    获取当前页标签属性
        html        生成html标签 直接用于模板语言
        bootstrap   直接使用bootstrap分页样式 需要导入bootstrap
        bootstrap_size  仅使用boostrap时模板生效 可选设置lg(大),sm(小)
        position    支持分页跳转后定位至html指定id处
    相关可用方法如下:
        setattr(attr,current_attr=None,inheritance=True)    设置标签属性
        ‘‘‘

    def __init__(self,totalCount,perPage,currentPage=1,pagerNumRange=0,argName=‘p‘,kwargs={}):
        ‘‘‘ totalCount  数据总数量
            perPage     每页显示数量
            currentPage    当前页码
            pagerNumRange  上一页/下一页中间显示多少条数字页码 默认(0)不显示
            argName     传递页码的GET参数名 默认为p
            kwargs      补充其他GET参数 一般为空或直接传入request.GET
        ‘‘‘
        self.maxPage = ceil(totalCount/perPage)
        try:
            self.currentPage = int(currentPage)
        except:
            self.currentPage = 1
        self.pagerNumRange = self._pager_num_range(pagerNumRange)
        self.argName = argName
        self.kwargs = ‘‘
        for k,v in kwargs.items():
            if k != self.argName:
                self.kwargs += ‘%s=%s&‘ % (k,v)
        self.end = self.currentPage * perPage
        self.start = self.end - perPage
        self.prvePage = self.currentPage - 1 if self.currentPage >1 else 1
        self.nextPage = self.currentPage + 1 if self.currentPage < self.maxPage else self.maxPage
        self.pattern = ‘<a {attr}href="?{kwargs}{argname}={href}">{content}</a> ‘
        self.attr,self._current_attr = ‘‘,‘‘
        self.bootstrap_size = ‘‘
        self.position = ‘‘
        self.pvreCode,self.nextCode = ‘&laquo;‘,‘&raquo;‘

    @property
    def current_attr(self):
        ‘‘‘返回当前页标签属性‘‘‘
        if self._current_attr:
            return self._current_attr
        else:
            return self.attr

    def _pager_num_range(self,pager_num_range):
        ‘‘‘分页显示页码数字列表‘‘‘
        if pager_num_range == 0:
            return []
        else:
            start = int(self.currentPage - (pager_num_range -1) / 2)
            end = int((self.currentPage + (pager_num_range - 1) / 2))
            if start < 1:
                end += 1 - start
                start = 1
                if end > self.maxPage:
                    end = self.maxPage
            if end > self.maxPage:
                start -= end - self.maxPage
                end = self.maxPage
                if start < 1:
                    start = 1
        return range(start,end+1)

    def setattr(self,attr,current_attr=None,inheritance=True):
        ‘‘‘设置标签属性
            attr    普通标签属性
            current_attr    为当前页设置额外的属性
            inheritance     当前页属性是否继承普通标签属性‘‘‘
        self.attr = ‘‘
        for k,v in attr.items():
            self.attr += ‘%s="%s" ‘ % (k,v)
        if current_attr:
            self._current_attr = ‘‘
            if inheritance:
                for k,v in attr.items():
                    if k in current_attr:
                        self._current_attr += ‘%s="%s" ‘ % (k, current_attr[k])
                    else:
                        self._current_attr += ‘%s="%s" ‘ % (k, v)
                for k in current_attr.keys() - attr.keys():
                    self._current_attr += ‘%s="%s" ‘ % (k, current_attr[k])
            else:
                for k,v in current_attr.items():
                    self._current_attr += ‘%s="%s" ‘ % (k, v)

    @property
    def html(self):
        ‘‘‘生成html‘‘‘
        pagelist = ‘‘
        position = ‘#‘ + self.position if self.position else ‘‘
        if self.currentPage > 1:
            pagelist = self.pattern.format(attr=self.attr,href=str(self.prvePage) + position,
                                           kwargs=self.kwargs,argname=self.argName,content=self.pvreCode)
        for r in self.pagerNumRange:
            if r == self.currentPage:
                pagelist += self.pattern.format(attr=self.current_attr, href=str(r) + position,
                                                kwargs=self.kwargs, argname=self.argName,content=r)
            else:
                pagelist += self.pattern.format(attr=self.attr,href=str(r) + position,
                                                kwargs=self.kwargs, argname=self.argName,content=r)
        if self.currentPage < self.maxPage:
            pagelist += self.pattern.format(attr=self.attr,href=str(self.nextPage) + position,
                                            kwargs=self.kwargs, argname=self.argName,content=self.nextCode)
        return mark_safe(pagelist)

    @property
    def bootstrap(self):
        ‘直接使用bootstrap样式‘
        html = ‘‘‘
        <nav aria-label="Page navigation">
          <ul class="pagination">
            {pages}
          </ul>
        </nav>
        ‘‘‘
        Previous = ‘‘‘
            <li {disable}>
              <a href="{prvePage}" aria-label="Previous">
                <span aria-hidden="true">%s</span>
              </a>
            </li>
        ‘‘‘ % self.pvreCode
        Next = ‘‘‘
            <li {disable}>
              <a href="{nextPage}" aria-label="Next">
                <span aria-hidden="true">%s</span>
              </a>
            </li>
        ‘‘‘ % self.nextCode
        pagelist = ‘‘
        position = ‘#‘ + self.position if self.position else ‘‘
        for r in self.pagerNumRange:
            if r == self.currentPage:
                pagelist += ‘<li class="active"><a href="?%s%s=%s%s">%s<span class="sr-only">(current)</span></a></li>‘ % (self.kwargs,self.argname,r,position, r)
            else:
                pagelist += ‘<li><a href="?%s%s=%s%s">%s</a></li>‘ % (self.kwargs,self.argName,r,position,r)
        if self.bootstrap_size in (‘lg‘,‘sm‘):
            html = html.replace(‘pagination‘,‘pagination pagination-%s‘ % self.bootstrap_size)
        if self.currentPage > 1:
            Previous = Previous.format(prvePage=‘?%s%s=%s‘ % (self.kwargs,self.argName,self.prvePage) + position,disable=‘‘)
        else:
            Previous = Previous.format(prvePage=‘#‘, disable=‘class="disabled"‘)
        if self.currentPage < self.maxPage:
            Next = Next.format(nextPage=‘?%s%s=%s‘ % (self.kwargs,self.argName,self.nextPage) + position,disable=‘‘)
        else:
            Next = Next.format(nextPage=‘#‘, disable=‘class="disabled"‘)
        return mark_safe(html.format(pages=Previous+pagelist+Next))

调用实例:

在views.py中

page = Paginator(len(USER_LIST),15,p,7,‘p‘,request.GET)

page.setattr(attr={‘class‘:‘btn btn-default‘}, current_attr={‘class‘:‘btn btn-default active‘})

page.size = ‘lg‘

return render(request,‘web/index.html‘, {‘PAGE‘:page,
‘USER_LIST‘:USER_LIST[page.start:page.end]})

在模板tempaltes中

{{ PAGE.html }} 或者 {{ PAGE.bootstrap }}

bootstrap是直接使用bootstrap分页样式,无需过多设置,而html方法则可以通过设置Paginator属性等方式,灵活多变。

原文地址:https://www.cnblogs.com/lazyfish007/p/11487542.html

时间: 2024-08-30 04:28:21

Django框架下的增强分页组件的相关文章

MySQL在Django框架下的基本操作(MySQL在Linux下配置)

[原]本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作,核心内容如下: ------------------------------------------------------------------------------------------------- 1. Linux环境下MySQL的安装与配置 2. [Linux]MySQL在Django框架下的基本操作 3. 本文相关的一些参考网址 注:本文会根据实践,持续更新文档,如有错误,希望读者指出哈!~ -----

Django框架下多国语言支持设置

Django框架下多国语言支持设置,步骤如下: 1.安装GNU gettext tools Django是通过gettext组建支持多国语言的,因此需要安装 下载地址为:http://gnuwin32.sourceforge.net/packages/gettext.htm window平台下载Binaries版本(编译好的exe,直接安装),然后设置系统路径 ubuntu平台:sudo apt-get install gettext 2.设置项目下得settings.py  = LOCALE_

手把手写一个基于Spring Boot框架下的参数校验组件

手把手写一个基于Spring Boot框架下的参数校验组件(JSR-303) 前言 之前参与的新开放平台研发的过程中,由于不同的接口需要对不同的入参进行校验,这就涉及到通用参数的校验封装,如果不进行封装,那么写出来的校验代码将会风格不统一.校验工具类不一致.维护风险高等其它因素,于是我对其公共的校验做了一个封装,达到了通过注解的方式即可实现参数统一校验. 遇到的问题                    在封装的时候就发现了一个问题,我们是开放平台,返回的报文都必须是统一风格,也就是类似于{co

Django框架-CRM项目之分页实现

自定义分页 分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应在数据库表中的起始位置. 1.设定煤业显示的数据条数 2.用户输入页码(第一页,第二页...) 3.根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置 4.在数据表中根据起始位置取值,页面上输出数据 前面那样会在页面中生成所有的页码,但实际需要是设定指定数量的页码,格式如 [上一页][1][2][3][4][5][下一页] 1.设定每页显示数据条数 2.用户输入页码 3.设定显示多少页号 4.获取当

Django 框架下的Blog 搭建 ---第一篇笔记

1.安装python 2.x 版本并加入环境变量 2.安装 virtualevn 工具将系统隔离成一个个虚拟docker 参考:https://pypi.python.org/pypi/virtualenv 2.1 mkdir 一个文件夹,并用 virtualenv  文件夹名, 虚拟一个带 setuptools 等工具的 python 环境 2.2 用 bin 目录下的工具 pip 进行安装Django    ./pip install Django==1.9.6  参考:https://do

django基础(四)- 分页组件

一.django内置分页 django内置分页使用到两个类:Paginator,Page 主要有如下方法及参数: #paginator对象 paginator = Paginator(L, 10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 #page对象 posts = paginator.page(current_page)

Django框架下的小人物--Cookie

1. 什么是Cookie,它的用途是什么? Cookies是一些存储在用户电脑上的小文件.它是被设计用来保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容,后者页面代码能够获取到Cookie值然后发送给服务器.比如Cookie中存储了所在地理位置,以后每次进入地图就默认定位到改地点即可. 2. 通过什么方式能获取到Cookie的内容,我能查看自己电脑上的Cookie吗? 能通过Web Server或者客户端浏览器来获取到Cookie.多数浏览器能够配置允许用户访问Cookies,但是注

django框架下ajax获取cookie和session的方法以及简单的vue

Django的配置: pycharm中创建django工程之后注释掉MIDDLEWARE项中的'django.middleware.csrf.CsrfViewMiddleware'.此处作用是为了能够让js获取到cookie值 同时为了使用mysql,我们在setting中修改DATABASES中的'default'项为 'ENGINE': 'django.db.backends.mysql', 'NAME': 'db_test_shop1', 'HOST':'127.0.0.1', 'PORT

1、Python django 框架下的word Excel TXT Image 等文件的上传

1.文件上传(input标签) (1)html代码(form表单用post方法提交) 1 <input class="btn btn-primary col-md-1" style="margin:0px 15px 25px 15px;" id="submitForm" type="button" value="提交" /> 2 <form id="picture_form&qu