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

描述: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属性等方式,灵活多变。

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

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

    [原]本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作,核心内容如下: ------------------------------------------------------ ...

  2. Django框架之Ajax和form组件

    一.Django框架之查漏补缺 1)models,字段概况 name = models.CharField(max_length=) age = models.IntegerField() price ...

  3. 基于ASP.NET的MVC框架下的MvcPaper分页控件的使用技术

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using Webdiyer. ...

  4. Django框架下报的版本问题

    报错环境 python=3.6.5,django=2.2,PyMySQL=0.9.3 …… django.core.exceptions.ImproperlyConfigured: mysqlclie ...

  5. mui前端框架下拉刷新分页加载数据

    前台 mui.init(); (function($) { //阻尼系数 var deceleration = mui.os.ios?0.003:0.0009; $('.mui-scroll-wrap ...

  6. Django框架下的小人物--Cookie

    1. 什么是Cookie,它的用途是什么? Cookies是一些存储在用户电脑上的小文件.它是被设计用来保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容,后者页面代码能够获取到Cookie ...

  7. django框架下celery+rabbitmq+flower完成异步任务

    [转载请注明出处:] http://www.cnblogs.com/yukityan/p/8035787.html 环境: ubuntu16.04 64位 安装: sudo apt-get insta ...

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

    1.文件上传(input标签) (1)html代码(form表单用post方法提交) <input class="btn btn-primary col-md-1" styl ...

  9. Django框架下数据存储实现时间戳格式存储到数据库2019-12-11 17:53:13

    2019-12-11 17:53:13 models.py class DomainDir(models.Model): date = models.DateTimeField() views.py ...

随机推荐

  1. centos yum 安装 mariadb

    1. 在 /etc/yum.repos.d/ 下建立 MariaDB.repo,输入内容 [mariadb] name=MariaDB baseurl=http://yum.mariadb.org/1 ...

  2. Of efficiency and methodology

    There are only too many articles and books which pertains to the discussion of efficiency and method ...

  3. loadrunner中的ie浏览器无法使用

    我的loadrunner是12.55版本的,windows10系统 在我们学习loadrunner的过程中,会出现下面一个问题: 在录制脚本时,loadrunner中的ie浏览器无法使用处于飘红状态. ...

  4. vscode中配置git

    vscode中配置git vscode 报错 未找到Git.请安装Git,或在"git.path" 设置中配置 第一步安装git git安装方法自行解决,提供git下载连接! gi ...

  5. opencv3 编程入门学习笔记(一): 基本函数介绍

    滤波 blur (均值滤波) 均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值) 缺点: 不能很好的保护图像细节, 在图像去噪的同时也 ...

  6. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

  7. Jenkins将ASP.NETCore部署到Azure

    首先需要获得Azure上App-service 的porfile. 登录portal 选到app,点击Get publish pofile 将得到一个 ****.PublishSettings,注意这 ...

  8. idea 2019安装完(打不开&&启动不了)问题解决(最全解决方法)

    今天从网盘把idea下载下来后一路安装,准备 设置的时候不管怎么打开 他都无动于衷没办法,卸了安,安了卸,反复折腾了 好几遍 它都无动于衷.于是开始在百度上找答案看了 好几个 方法一遍一遍试还是不行, ...

  9. [ PyQt入门教程 ] PyQt+socket实现远程操作服务器

    来需求了..干活啦.. 需求内容 部分时候由于缓存刷新.验证码显示不出来或者浏览器打不开或者打开速度很慢等原因,导致部分测试同事不想使用浏览器登录服务器执行命令.期望有小工具可以替代登录浏览器的操作, ...

  10. 新手学习selenium路线图(老司机亲手绘制)

    前言: 最近群里有不少小白,想入手selenium,但是一直没找到学习路线,还没入门就迷路了,于是小编亲手绘制了一幅学习路线图.希望能帮助小白快速入门,帮助已经入门的,尽快提升! 学习selenium ...