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

描述: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. Tomcat源码分析 (一)----- 手写一个web服务器

    作为后端开发人员,在实际的工作中我们会非常高频地使用到web服务器.而tomcat作为web服务器领域中举足轻重的一个web框架,又是不能不学习和了解的. tomcat其实是一个web框架,那么其内部 ...

  2. jenkins部署自动化项目备注

    一.定时任务部署: 第一个*表示分钟,取值0~59 第二个*表示小时,取值0~23 第三个*表示一个月的第几天,取值1~31 第四个*表示第几月,取值1~12 第五个*表示一周中的第几天,取值0~7, ...

  3. 富文本编辑器TinyMCE的使用(React Vue)

    富文本编辑器TinyMCE的使用(React Vue) 一,需求与介绍 1.1,需求 编辑新闻等富有个性化的文本 1.2,介绍 TinyMCE是一款易用.且功能强大的所见即所得的富文本编辑器. Tin ...

  4. .net core web api部署到Linux系统CentOS 7

    一.创建一个.net core web api 的Demo 完成后的项目结构如图 修改下监听端口 发布代码 二.发布到CentOS 7上并运行 下一步需要一定的虚拟机知识了,我这里使用了windows ...

  5. eclipse导入码云-GIT项目

    1.首先找到项目源码地址我随便找到一个git地址 :https://gitee.com/mingSoft/MCMS 2.打开eclipse空白处右键导入项目搜索git. 3.将第一步复制的git地址复 ...

  6. java支付宝app支付-代码实现

    1.我们需要在支付宝商户平台配置好,取到四个参数如下(这是支付宝官方配置地址):https://www.cnblogs.com/fuzongle/p/10217144.html 合作身份者ID:123 ...

  7. 算法与数据结构基础 - 二叉查找树(Binary Search Tree)

    二叉查找树基础 二叉查找树(BST)满足这样的性质,或是一颗空树:或左子树节点值小于根节点值.右子树节点值大于根节点值,左右子树也分别满足这个性质. 利用这个性质,可以迭代(iterative)或递归 ...

  8. 单纯的xlistview

    public class MainActivity extends AppCompatActivity implements XListView.IXListViewListener{ private ...

  9. Vue中拆分视图层代码的5点建议

    目录 一.框架的定位 二. Vue开发中的script拆分优化 1.组件划分 2.剥离业务逻辑代码 3. 剥离数据转换代码 4. 善用computed和filters处理数据展示 5. 使用direc ...

  10. Knative 基本功能深入剖析:Knative Serving 之服务路由管理

    导读:本文主要围绕 Knative Service 域名展开,介绍了 Knative Service 的路由管理.文章首先介绍了如何修改默认主域名,紧接着深入一层介绍了如何添加自定义域名以及如何根据 ...