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 ...
随机推荐
- zookeeper 集群配置
安装前要先确保配置好 jdk,这里不在讲述 一. 将zookeeper 安装包下载到你想要的目录 下载地址:http://mirrors.hust.edu.cn/apache/zookeeper/ m ...
- 【Java例题】5.5 映射类的使用
5.映射类的使用.使用HashMap保存英文-中文对照单词词典.单词词典可以增加和删除词汇.输入一个英文单词,翻译成中文并显示.输入一个中文单词,翻译成英文并显示. package chapter6; ...
- java中String,StringBuffer,StringBuilder的区别
String: 1,是字符串常量,一旦创建就不能修改.对于已经存在了的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. 2,String也是final类,不能被继承. 3,而且S ...
- laya 下以光标为中心缩放对象
private MouseWheel(e: Laya.Event) { console.log("event"); let currentSp = e.target as Laya ...
- MYSQL--存储引擎、数据类型、约束条件、
存储引擎: 不同的数据应该有不同的处理机制 mysql存储引擎 Innodb:默认的存储引擎 查询速度相比于myisam慢 但是更安全 myisam:mysql老版本用的存储引擎 memory:内 ...
- JVM(十一):内存分配
JVM(十一):内存分配 在前面的章节中,我们花了大量的篇幅去介绍 JVM 内的内存布局.对象在内存中的状态.垃圾回收的算法和具体实现等.今天让我们探讨一下对象是如何分配内存的. 堆内存划分 前面说过 ...
- Go---go-cache包学习
github.com/patrickmn/go-cachego-cache是一款类似于memached 的key/value 缓存软件.它比较适用于单机执行的应用程序.go-cache实质上就是拥有过 ...
- .net core 添加本地dll
公司内部开发的核心类库,添加到新项目中去,可以使用如下方法. 1.设置包信息 右击项目-属性,选着打包,输入相关信息. 2.核心类库打包成 *.nupkg文件, 3.创建一个文件夹.将打包的nupkg ...
- [HAOI2015]树上染色(树上dp)
[HAOI2015]树上染色 这种要算点对之间路径的长度和的题,难以统计每个点的贡献.这个时候一般考虑算每一条边贡献了哪些点对. 知道这个套路以后,那么这题就很好做了. 状态:设\(dp[u][i]\ ...
- 在github上搭建个人博客并在线更新
换博客比更博还勤的我终于决定写一篇博客搭建教程了.. FAQ Q:\(hexo\)需要本地编译.\(jekyll\)虽然可以直接上传\(md\)..但是如果在github上直接编译也太难受了叭,毕竟不 ...