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 = '«','»' @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框架下的增强分页组件的更多相关文章
- MySQL在Django框架下的基本操作(MySQL在Linux下配置)
[原]本文根据实际操作主要介绍了Django框架下MySQL的一些常用操作,核心内容如下: ------------------------------------------------------ ...
- Django框架之Ajax和form组件
一.Django框架之查漏补缺 1)models,字段概况 name = models.CharField(max_length=) age = models.IntegerField() price ...
- 基于ASP.NET的MVC框架下的MvcPaper分页控件的使用技术
using System; using System.Collections.Generic; using System.Linq; using System.Web; using Webdiyer. ...
- Django框架下报的版本问题
报错环境 python=3.6.5,django=2.2,PyMySQL=0.9.3 …… django.core.exceptions.ImproperlyConfigured: mysqlclie ...
- mui前端框架下拉刷新分页加载数据
前台 mui.init(); (function($) { //阻尼系数 var deceleration = mui.os.ios?0.003:0.0009; $('.mui-scroll-wrap ...
- Django框架下的小人物--Cookie
1. 什么是Cookie,它的用途是什么? Cookies是一些存储在用户电脑上的小文件.它是被设计用来保存一些站点的用户数据,这样能够让服务器为这样的用户定制内容,后者页面代码能够获取到Cookie ...
- django框架下celery+rabbitmq+flower完成异步任务
[转载请注明出处:] http://www.cnblogs.com/yukityan/p/8035787.html 环境: ubuntu16.04 64位 安装: sudo apt-get insta ...
- 1、Python django 框架下的word Excel TXT Image 等文件的上传
1.文件上传(input标签) (1)html代码(form表单用post方法提交) <input class="btn btn-primary col-md-1" styl ...
- Django框架下数据存储实现时间戳格式存储到数据库2019-12-11 17:53:13
2019-12-11 17:53:13 models.py class DomainDir(models.Model): date = models.DateTimeField() views.py ...
随机推荐
- RocketMQ中Broker的HA策略源码分析
Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...
- 【Java例题】7.5 文件题2-学生成绩统计
5.学生成绩统计.已有一个学生成绩文件,含有多位学生的各三门课的成绩:读取这个文件中的每位学生的三门课成绩,然后计算均分:最后对这些均分按照大于或小于75分的界限,分别写到另两个文件中. packag ...
- 有趣的RPC理解
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通 ...
- 最简单的DWR例子
什么是DWR? DWR是一个Open Source的 java项目.DWR可以让JavaScript调用运行在Web服务器里面的JAVA程序.简单一点或者专业一点就是Easy AJAX for JAV ...
- powerdesign进军(三)--mysql驱动配置
目录 资源下载 powerdesign配置 总结 第二节我们已经安装了oracle的驱动,但是企业中还有一个重头数据库(mysql),今天来安装mysql驱动.mysql相较oracle比较简单. 资 ...
- php 中session_set_cookie_params 和 setcookie 函数的区别与用法
session_set_cookie_params() 函数不管刷不刷新页面,都不会改变cookie的过期时间, 但setcookie() 函数页面每刷新一次,cookie 的过期时间就会刷新一次. ...
- 学习Vuex 个人的一些拙见。
首先说下什么是vuex?这个是对vue的状态的管理,这样说可能有点大,其实就是vue 里面 data 的管理,或者说是多个vue 组件共有的data 的一种管理, 在任何一个组件里面,都可以修改,访 ...
- 上传文件时 重新载入页面以获取源代码 http://*/upload.php
今天做一个处理上传文件的接口时碰到这样一个问题, 用的是element-ui的上传组件,但是上传失败, 抓包一看返回的是 重新载入页面以获取源代码 http://*/upload.php 网上搜了一下 ...
- Jvm内存泄漏
内存泄漏和内存溢出的关系 内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存.即被分配的对象可达但已无用. 内存溢出:指程序运行过程中无法申请到足够的内存而导致的一 ...
- 【原创】关于DNS不得不说的一些事
引言 今天我们来聊聊DNS. 所谓域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据 ...