Python自定义分页插件,其他语言逻辑相同
分页器包含基础的上一页、下一页、首页、尾页等。
分页器代码
"""
---------
分页器插件
---------
"""
# css class名 ↓ ↓
# PreviousPage 上一页
# NextPage 下一页
# EndPage尾页
# StartPage 首页
# ItemPage 每一页
# ActivePage 选中页
class Pagination:
def __init__(self,totalNums,pageUrl,nowPage,perPage=10,perDisPage=11,
pageUp=True,pageNext=True,startPage=True,endPage=True,hidePageUp=False,hidePageNext=False,perTotol=True):
"""
通过类方法获得当前页数起始数据索引,结束数据索引,对总数据进行切片,得到当前页的内容
自定制分页插件,修改样式通过修改css class名设置不同的样式,可使用JavaScript技术修改页码显示内容,及添加类名。
css class名:↓ ↓
PreviousPage 上一页
NextPage 下一页
EndPage尾页
StartPage 首页
ItemPage 每一页
ActivePage 选中页
PerTotolPage 单页/总页
PageList 包装每页的盒子
NoActive 首页或尾页 不能点的样式
:param totalNums: 总数据量 无默认
:param nowPage:当前页 无默认
:param pageUrl: 每页跳转地址 无默认
:param perPage: 每页显示的数据量 默认10
:param perDisPage: 显示的页数 默认11
:param pageUp:是否有上一页 默认True
:param pageNext:是否有下一页 默认True
:param startPage:是否显示开始页 默认True
:param endPage:是否显示结束页 默认True
:param hidePageUp:首页是否隐藏上一页 默认False
:param hidePageNext:尾页是否隐藏下一页 默认False
:param perTotol:是否显示 单页/总页(1/4 默认True
"""
self.__total_nums = totalNums
self.__per_page = perPage
self.__page_url = pageUrl
self.__per_dis_page = perDisPage
self.__page_up = pageUp
self.__page_next = pageNext
self.__start_page = startPage
self.__end_page = endPage
self.__hid_page_up = hidePageUp
self.__hid_page_next = hidePageNext
self.__per_totol = perTotol
a,b = divmod(self.__total_nums,self.__per_dis_page) # 求余数和商
if b == 0:
self.all_page = a # 如果没有余数,总页数为商
else:
self.all_page = a + 1 # 如果有余数 总页数为商+1
try:
self.__now_page = int(nowPage) # 当前页 转换为 数字
if self.__now_page < 0: # 如果 页码成为负数,取其绝对值
self.__now_page = abs(self.__now_page)
elif self.__now_page == 0: # 如果当前页码为0 为第1页
self.__now_page = 1
elif self.__now_page > self.all_page: # 如果页码超过的最大页数 将页码设置 最大页码
self.__now_page = self.all_page
except Exception:
self.now_page = 1 # 输入非数字的 都为第1页
@property
def startPage(self):
"""
获得页码范围的起始值
:return: 起始页码
"""
if self.__now_page >= self.all_page - int(self.__per_dis_page / 2):
return self.all_page-(self.__per_dis_page+1)
if self.__now_page <= int(self.__per_dis_page/2):
return 1
return self.__now_page-int(self.__per_dis_page/2)
@property
def endPage(self):
"""
获得页码范围的最后值
:return:结束页码
"""
if self.__now_page <= int(self.__per_dis_page/2):
return self.__per_dis_page+1
if self.__now_page >= self.all_page-int(self.__per_dis_page/2):
return self.all_page
return self.__now_page+int(self.__per_dis_page/2)
@property
def Html(self):
page_lable = []
page_lable.append("<ul class='PageList' style='display:flex'>") # ul盒子开始
# 首页设置
if self.__start_page: # 如果有首页
page_lable.append("<li><a class='StartPage' href='/%s?page=1'>首页</a></li>"% self.__page_url)
# 上一页设置
if self.__page_up: # 如果有上一页
if self.__now_page == 1 :
if not self.__hid_page_up: # 如果不隐藏
page_lable.append("<li><a class='PreviousPage NoActive' href='#'>上一页</a></li>") # 如果在第一页 让首页点不动
else:
page_lable.append("<li><a class='PreviousPage' href='/%s?page=%s'>上一页</a></li>" % (
self.__page_url, self.__now_page - 1))
# 每个页码
for page_num in range(self.startPage, self.endPage+1):
if page_num == self.__now_page: # 选中页的不同class
temp_lable = "<li><a class='ItemPage ActivePage' href='/%s?page=%s'>%s</a></li>"%(self.__page_url, page_num,page_num)
else:
temp_lable = "<li><a class='ItemPage' href='/%s?page=%s'>%s</a></li>"%(self.__page_url, page_num, page_num)
page_lable.append(temp_lable) # 将每个标签填入 标签列表
if self.__per_totol:
page_lable.append("<span class='PerTotolPage'>%s/%s</span>"%(self.__now_page,self.all_page))
# 设置下一页
if self.__page_next:
if self.__now_page == self.all_page :
if not self.__hid_page_next: # 如果不隐藏
page_lable.append("<li><a class='NextPage NoActive' href='#'>下一页</a></li>") # 如果在最后页 让尾页点不动
else:
page_lable.append(
"<li><a class='NextPage' href='/%s?page=%s'>下一页</a></li>" % (self.__page_url, self.__now_page + 1))
# 尾页设置
if self.__end_page: # 如果有尾页
page_lable.append("<li><a class='EndPage' href='/%s?page=%s'>尾页</a></li>"% (self.__page_url,self.all_page))
page_lable.append("</ul>") # ul盒子结束
return "\n".join(page_lable)
views代码(基于Django)
page = request.GET.get("page",1) # 获得当前页
lis = [] # 总数据,
for i in range(0,500):
lis.append("测试分页%s----------%s"%(i,i)) # 添加测试数据
from MyDjango.pagination import Pagination
test = Pagination(len(lis),"use_space",page,perPage=2) # 创建分页
data = lis[test.startPage:test.endPage:] # 对数据切片
Html代码(基于Django)
非常简洁
{% for i in data %}
<p>{{ i }}</p>
{% endfor %}
{{ test.Html|safe }}