`
三月沙
  • 浏览: 619470 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python 分页工具

阅读更多

分页工具基础类

 

#分页工具
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>
 
分享到:
评论

相关推荐

    Python利用flask sqlalchemy实现分页效果

    Flask-SQLAlchemy是一个专门为Flask设计的ORM(对象关系映射)工具包,它可以简化数据库操作,并提供了一系列便捷的方法来处理SQLAlchemy相关的任务。在Flask应用中使用Flask-SQLAlchemy,可以帮助开发者更高效地...

    Python小工具爬取PPT模板.zip

    在这个“Python小工具爬取PPT模板”的项目中,我们看到一个使用Python编写的爬虫工具,其目标是自动化地从网络上抓取PPT模板。这个压缩包包含了一个名为"spider.exe"的可执行文件,可能是经过编译的Python代码,方便...

    python实现分页效果

    本示例提供了一个基本的Python分页控件实现方案,可用于学习和理解分页的基本概念和实现流程。在实际项目开发中,可能还需要考虑更多的细节问题,例如性能优化、异常处理等。此外,还可以结合数据库查询或API接口调...

    Python-Iris是一个高度可配置的灵活服务用于分页和信息传递

    Iris是Python编程语言中的一款强大工具,专为分页和信息传递设计。在Web开发中,数据分页是必不可少的功能,尤其在处理大量数据时,能够有效地提升用户体验,减少服务器负载。Iris的出现,为开发者提供了高度可配置...

    python 实现分页显示从es中获取的数据方法

    在Python编程中,Elasticsearch是一个非常流行的开源搜索引擎和分析工具,它允许开发者高效地存储、检索和分析大量数据。本文将详细介绍如何使用Python来实现从Elasticsearch中获取数据并进行分页显示的方法。 首先...

    分页工具

    在IT行业中,分页工具是一种常见且至关重要的功能,尤其在大数据量的展示和处理时。它能够有效地组织和管理大量的信息,使用户能够逐步浏览和处理数据,而不是一次性加载所有内容,这样不仅可以提高用户体验,还能...

    插入分页符

    编程环境与工具 本文示例代码基于Visual Basic for Applications (VBA)编写,适用于Microsoft Office Word。VBA是一种强大的脚本语言,可以用来自动化Word中的各种任务。 #### 三、插入分页符的方法 在VBA中,...

    用python爬取网页并导出为word文档.docx

    首先,Python中的`requests`库是用于发送HTTP请求的工具,它能够帮助我们获取网页的HTML源码。例如,在爬取深圳市规划和自然资源局的公示源码时,我们可以先导入`requests`库,然后通过`get()`函数发送GET请求: ``...

    python数据分析与可视化-13-分页查询.ev4.zip

    在Python中进行数据分析和可视化是现代数据科学领域中...总之,Python提供了多种方式处理分页查询,无论是在数据库层面还是在数据处理库中,都有丰富的工具可供选择。理解并掌握这些方法对于高效地处理大数据至关重要。

    基于Python实现的实验信息综合管理系统_python实验室_python管理系统_实验室管理系统_实验室管理

    【基于Python实现的实验信息综合管理系统】是一种利用Python编程语言设计和开发的高效、便捷的实验室管理工具。Python因其简洁的语法和丰富的库支持,在数据分析、Web开发和系统管理等领域广泛应用,同样适用于构建...

    python-3.6.5-64位

    - **分页内存管理**:Python 3.6引入了分页内存分配策略,降低了内存碎片,提高了内存效率。 7. **错误和异常处理**: - **新的`SyntaxError`子类**:增加了更多特定的语法错误类型,使错误信息更精确,便于定位...

    Python-Graphene是Python的GraphQL框架

    除了基础功能,Graphene还支持自定义类型、连接(Connections)和分页、中间件(Middleware)以及自定义执行策略等功能,使得在Python中构建复杂的GraphQL服务变得简单且强大。 总结,Graphene是Python开发者的有力...

    分页控件;分页控件;分页控件

    分页控件是网页或应用程序...总结来说,分页控件是提升数据展示体验的关键工具,合理的设计和实现能大大提高用户在处理大量信息时的效率。无论是在前端还是后端开发中,理解和掌握分页控件的原理和实践都是非常重要的。

    Python-SnaqlRawQL在Python中无痛使用原始SQL

    总的来说,Snaql Raw QL为Python开发者提供了一个强大而灵活的工具,它让你能够在保持代码清晰和简洁的同时,充分利用SQL的能力。无论你是数据库新手还是经验丰富的DBA,都可以通过Snaql Raw QL在Python中轻松地处理...

    Python-一个OSINT工具允许你通过认可技能绘制出LinkedIn上的人员之间的关系

    本项目“Python-一个OSINT工具允许你通过认可技能绘制出LinkedIn上的人员之间的关系”是利用Python的网络爬虫技术和数据分析能力,帮助用户深入挖掘LinkedIn社交网络中的信息,并通过成员的技能认可来可视化人际关系...

    分页控件+排序+分页

    在IT行业中,分页控件和排序是网页和应用程序中常用的功能,特别是在处理大量数据时。...在实际项目中,根据需求选择合适的工具和方法,结合前后端分离的架构,可以有效地实现高效、灵活的分页和排序功能。

    Python-基于PythonDjango用于restful风格API的MockServer

    - **使用Django REST framework**:这是一个Django的扩展,提供了更强大的工具来构建RESTful APIs,如序列化、权限控制和分页等。 - **自动化测试**:可以结合Django的测试客户端和单元测试框架,自动化测试Mock...

    Python库 | python-redmine-0.8.0.tar.gz

    Python库是开发者在编程时经常会使用到的工具,它们提供了丰富的功能,可以帮助程序员快速实现特定任务,提升开发效率。在本案例中,我们关注的是一个名为`python-redmine`的库,版本为0.8.0,它是一个用Python编写...

    Python-使用seleniumPhantomJs搭建的简单漫画爬虫工具

    **Python-使用selenium PhantomJs搭建的简单漫画爬虫工具** 在Python开发中,Web爬虫是一种常见的数据抓取技术,用于自动化地从互联网上获取大量数据。本项目利用Python的selenium库与PhantomJs浏览器模拟器,构建...

Global site tag (gtag.js) - Google Analytics