分页工具基础类
#分页工具
from math import ceil,floor
class InvalidPage(Exception):
pass
class PageNotAnInteger(InvalidPage):
pass
class EmptyPage(InvalidPage):
pass
class Paginator(object):
def __init__(self,total_records=None,per_page=None,display_certain_size=5):
#总条数
self.total_records = total_records
#每页显示的条数
self.per_page = per_page
#计算出来的页数
self.total_pages=0
#计算出来的数据
self.data={}
#当前每个页面显示的链接数比如1,2,3 共三个链接
self.display_certain_size=display_certain_size
#开始计算分页
self.__judge__()
def __judge__(self):
#如果总记录不够在一页显示,则开始分页
if self.total_records>self.per_page:
#计算总页数 向下取整
self.total_pages = int(floor(self.total_records/float(self.per_page)))
#计算每页的起始和结束位置即[start:end]
for i in range(0,self.total_pages):
if i==0:
self.data[i+1]=Page(i+1,i,i+self.per_page,self)
else:
self.data[i+1]=Page(i+1,self.data[i].end,self.data[i].end+self.per_page,self)
#如果计算出来的页数不恰巧是个整数,那么还需要计算最后一页
if self.total_pages<(self.total_records/float(self.per_page)):
#计算最后一页,因为最后一页肯定是能全页显示的
self.data[self.total_pages+1]=Page(self.total_pages+1,self.data[self.total_pages].end,self.total_records,self)
else:
self.total_pages=1
self.data[1]=Page(1,0,self.total_records,self)
#根据页码,返回每页数据的开始和结束位置
def page(self,page_number):
page_number = int(page_number)
if page_number in self.data.keys():
return self.data[page_number]
else:
raise EmptyPage("the page contains no results")
#判断是否总页数少于一次性显示的页数,这个主要是可以自己定制页面的链接数的显示,比如如果为true,那么下一页和上一页就可以不显示
def check_less_than_certain_size(self):
if len(self.data)<=self.display_certain_size:
return True
else:
return False
#根据计算每次需要显示的页面链接数,即如果当前是:2,3,4,5 当点击4时,页面的显示应该怎样显示
def calculate_display_pages(self,page_number):
#如果当前请求的页面数小于每次显示的链接数
display_pages={}
#全部链接都显示,如果只有一页不显示链接数
if len(self.data)==1:
return None
elif self.check_less_than_certain_size():
return self.sort_dict_values(self.data)
else:
if page_number<=self.display_certain_size/float(2):
for i in range(0,self.display_certain_size):
display_pages[i+1]=self.data[i+1]
else:
#当前页面减去显示大小的一半 还大于0,加上显示大小的一半还小于总的大小
half_of_display_certain_size = int(floor(self.display_certain_size/float(2)))
if page_number-half_of_display_certain_size>0 and page_number+half_of_display_certain_size<=len(self.data):
for i in range(page_number-half_of_display_certain_size,page_number+half_of_display_certain_size+1):
display_pages[i]=self.data[i]
else:
for i in range(len(self.data)-self.display_certain_size+1,len(self.data)+1):
display_pages[i]=self.data[i]
return self.sort_dict_values(display_pages)
#因为字典是无序的,先进行排序
def sort_dict_values(self,adict):
keys = adict.keys()
keys.sort()
return [(key,adict[key]) for key in keys]
#页面类 包含每页取数的开始和结束位置,以及页面的位置
class Page(object):
def __init__(self,page_number=1,start=0,end=0,paginator=None):
#每页的起始位置
self.start=start
#每页的结束位置
self.end=end
#每页的页码
self.page_number=page_number
#分页工具类
self.paginator = paginator
#下一页
self.next_page_number = self.page_number+1
#上一页
self.prev_page_number = self.page_number-1
def __repr__(self):
return '<Page start at %s end at %s>' % (self.start,self.end)
#是否具有下一页
def has_next(self):
return self.page_number<self.paginator.total_records/float(self.paginator.per_page)
#是否有前一页
def has_prev(self):
return self.page_number>1
分页工具的用法
paginator = Paginator(total_count,20)
page_number = request.GET.get('page')
if page_number and page_number.isdigit():
try:
page = paginator.page(int(page_number))
pages = paginator.calculate_display_pages(int(page_number))
except EmptyPage:
page = paginator.page(1)
pages = paginator.calculate_display_pages(1)
else:
page = paginator.page(1)
pages = paginator.calculate_display_pages(1)
less_than_certain_size = paginator.check_less_than_certain_size()
questions = get_limit_record(u.id,page.start,page.end)
页面的显示用法
<div class="page" >
{% if page.prev_page_number and not less_than_certain_size %}
<a href="{% url ask.iviews.ask %}?page={{ page.prev_page_number }}" class="prev"> <<-上一页</a>
{% endif %}
{% for key,value in pages %}
{% ifequal page.page_number key %}
<a href="{% url ask.iviews.ask %}?page={{ key }}" style='color:#105CB6;font-weight:bolder;border-color:#fff' > {{ value.page_number }} </a>
{% else %}
<a href="{% url ask.iviews.ask %}?page={{ key }}" > {{ value.page_number }} </a>
{% endifequal %}
{% endfor %}
{% if page.has_next and not less_than_certain_size %}
<a href="{% url ask.iviews.ask %}?page={{ page.next_page_number }}" class="next" >下一页->></a>
{% endif %}
</div>
分享到:
相关推荐
Flask-SQLAlchemy是一个专门为Flask设计的ORM(对象关系映射)工具包,它可以简化数据库操作,并提供了一系列便捷的方法来处理SQLAlchemy相关的任务。在Flask应用中使用Flask-SQLAlchemy,可以帮助开发者更高效地...
在这个“Python小工具爬取PPT模板”的项目中,我们看到一个使用Python编写的爬虫工具,其目标是自动化地从网络上抓取PPT模板。这个压缩包包含了一个名为"spider.exe"的可执行文件,可能是经过编译的Python代码,方便...
本示例提供了一个基本的Python分页控件实现方案,可用于学习和理解分页的基本概念和实现流程。在实际项目开发中,可能还需要考虑更多的细节问题,例如性能优化、异常处理等。此外,还可以结合数据库查询或API接口调...
Iris是Python编程语言中的一款强大工具,专为分页和信息传递设计。在Web开发中,数据分页是必不可少的功能,尤其在处理大量数据时,能够有效地提升用户体验,减少服务器负载。Iris的出现,为开发者提供了高度可配置...
在Python编程中,Elasticsearch是一个非常流行的开源搜索引擎和分析工具,它允许开发者高效地存储、检索和分析大量数据。本文将详细介绍如何使用Python来实现从Elasticsearch中获取数据并进行分页显示的方法。 首先...
在IT行业中,分页工具是一种常见且至关重要的功能,尤其在大数据量的展示和处理时。它能够有效地组织和管理大量的信息,使用户能够逐步浏览和处理数据,而不是一次性加载所有内容,这样不仅可以提高用户体验,还能...
Python交换机自动备份脚本是一种高效管理网络设备的方法,它能帮助网络管理员便捷地备份多个交换机的配置,包括华为、思科、华三和Aruba等...对于熟悉Python编程和网络设备操作的人员来说,这是一个非常实用的工具。
编程环境与工具 本文示例代码基于Visual Basic for Applications (VBA)编写,适用于Microsoft Office Word。VBA是一种强大的脚本语言,可以用来自动化Word中的各种任务。 #### 三、插入分页符的方法 在VBA中,...
首先,Python中的`requests`库是用于发送HTTP请求的工具,它能够帮助我们获取网页的HTML源码。例如,在爬取深圳市规划和自然资源局的公示源码时,我们可以先导入`requests`库,然后通过`get()`函数发送GET请求: ``...
在Python中进行数据分析和可视化是现代数据科学领域中...总之,Python提供了多种方式处理分页查询,无论是在数据库层面还是在数据处理库中,都有丰富的工具可供选择。理解并掌握这些方法对于高效地处理大数据至关重要。
【基于Python实现的实验信息综合管理系统】是一种利用Python编程语言设计和开发的高效、便捷的实验室管理工具。Python因其简洁的语法和丰富的库支持,在数据分析、Web开发和系统管理等领域广泛应用,同样适用于构建...
- **分页内存管理**:Python 3.6引入了分页内存分配策略,降低了内存碎片,提高了内存效率。 7. **错误和异常处理**: - **新的`SyntaxError`子类**:增加了更多特定的语法错误类型,使错误信息更精确,便于定位...
除了基础功能,Graphene还支持自定义类型、连接(Connections)和分页、中间件(Middleware)以及自定义执行策略等功能,使得在Python中构建复杂的GraphQL服务变得简单且强大。 总结,Graphene是Python开发者的有力...
分页控件是网页或应用程序...总结来说,分页控件是提升数据展示体验的关键工具,合理的设计和实现能大大提高用户在处理大量信息时的效率。无论是在前端还是后端开发中,理解和掌握分页控件的原理和实践都是非常重要的。
总的来说,Snaql Raw QL为Python开发者提供了一个强大而灵活的工具,它让你能够在保持代码清晰和简洁的同时,充分利用SQL的能力。无论你是数据库新手还是经验丰富的DBA,都可以通过Snaql Raw QL在Python中轻松地处理...
标题中提到的"Python ReportLab文档",指的是一套使用Python编程语言编写的库,专门用于生成PDF报表和文档。ReportLab是一个功能强大的库,它允许用户创建复杂和专业的PDF文档,包括但不限于图表、文本、表格以及...
本项目“Python-一个OSINT工具允许你通过认可技能绘制出LinkedIn上的人员之间的关系”是利用Python的网络爬虫技术和数据分析能力,帮助用户深入挖掘LinkedIn社交网络中的信息,并通过成员的技能认可来可视化人际关系...
在IT行业中,分页控件和排序是网页和应用程序中常用的功能,特别是在处理大量数据时。...在实际项目中,根据需求选择合适的工具和方法,结合前后端分离的架构,可以有效地实现高效、灵活的分页和排序功能。
- **使用Django REST framework**:这是一个Django的扩展,提供了更强大的工具来构建RESTful APIs,如序列化、权限控制和分页等。 - **自动化测试**:可以结合Django的测试客户端和单元测试框架,自动化测试Mock...
Python库是开发者在编程时经常会使用到的工具,它们提供了丰富的功能,可以帮助程序员快速实现特定任务,提升开发效率。在本案例中,我们关注的是一个名为`python-redmine`的库,版本为0.8.0,它是一个用Python编写...