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 ...
随机推荐
- java文字转语音播报功能的实现方法
java文字转语音播报功能的实现方法 一.pom.xml引入jar包依赖 <!-- https://mvnrepository.com/artifact/com.jacob/jacob 文字转语 ...
- [译]使用golang每分钟处理百万请求
[译]使用golang每分钟处理百万请求 在Malwarebytes,我们正在经历惊人的增长,自从我在1年前加入硅谷的这家公司以来,我的主要职责是为多个系统做架构和开发,为这家安全公司的快速发展以及百 ...
- Java.基础 -------- 一个Java源文件中可以有很多类,但只能有一个类是public的
一个Java源文件中可以有很多类,但只能有一个类是public的 Java程序是从一个public类main函数开始执行的,只能有一个public是为了给类装载器提供方便,一个publi ...
- SSM框架的详细解说
文章转载自:http://blog.csdn.net/zhshulin 使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就 ...
- vue+element搭建后台管理界面(支持table条件搜索)
代码地址(如果有帮助,请点个Star) vue:https://github.com/wwt729/ElementUIAdmin-master.git springboot后端:https://git ...
- python 函数和函数名的应用
一.函数 1.函数定义 def 关键字 -- 定义 func 函数名 -- 和变量定义规则一样 ()必须要写格式 : 声明语句结束 def my_len(): 函数体 def func(a:int ...
- django 获取当前访问的URL
next_url = request.path_info print(next_url) print(request.get_full_path()) //打印出全路径(路径和参数) print(re ...
- git 常规业务场景 使用
一般每个开发者都会有个自己的分支,有个test分支,合并代码用,两条分支相互备份,就算merge的时候被覆盖,也不用担心 建立自己的分支 // 创建本地分支, git checkout -b dev_ ...
- 关于Python虚拟环境与包管理你应该知道的事
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- DNS主、从域名服务器配置
#命令为红色 #vi编辑内容为蓝色 建立主.从或者缓存域名服务器,前提一定要关闭防火墙和linux防护机制,否则不能成功解析客户机请求 永久关闭防火墙和安全机制命令如下: systemctl stop ...