先看效果:
附上源码:
"""
自定义分页
传入:
-所有数据的个数
-当前页
-每页显示30条
-最多页面7个
"""
class Pagination():
def __init__(self, totalCount, currentPage, Url, perPagItemNum=5, maxPagNum=7,):
# 数据总总条数,当前页,跳转的url,每页显示条数,最多显示页码
self.Url=Url
self.totalCount = totalCount
try:
v = int(currentPage)
if v <= 0:
v = 1
self.currentPage = v
except Exception as e:
self.currentPage = 1
self.perPagItemNum = perPagItemNum
self.maxPagNum = maxPagNum
self.currentPage = currentPage
def Start(self):
return (self.currentPage - 1) * self.perPagItemNum
def End(self):
return self.currentPage * self.perPagItemNum
@property
def TotalPage(self): # 总页数
result = divmod(self.totalCount, self.perPagItemNum)
if result[1] == 0:
return result[0]
else:
return result[0] + 1
def page_num_range(self):
# 当前页面
# self.current_page
# 总页数
# self.num_pages
# 最多显示的页码个数
# self.max_pager_num
if self.TotalPage < self.maxPagNum:
return range(1, self.TotalPage + 1)
part = int(self.maxPagNum / 2)
if self.currentPage - part < 1:
return range(1, self.maxPagNum + 1)
if self.currentPage + part > self.TotalPage:
return range(self.TotalPage + 1 - self.maxPagNum, self.TotalPage + 1)
return range(self.currentPage - part, self.currentPage + part + 1)
def page_str(self):
page_list = []
first="<li><a href='"+self.Url+"?p=1'>首页</a></li>"
page_list.append(first)
if self.currentPage == 1:
prev = "<li><a href='#'>上一页</a></li>"
else:
prev = "<li><a href='"+self.Url+"?p=%s'>上一页</a></li>" % (self.currentPage - 1,)
page_list.append(prev)
for i in self.page_num_range():
if i==self.currentPage:
temp = "<li class= 'active'><a href='"+self.Url+"?p=%s'>%s</a></li>" % (i, i)
else:
temp = "<li ><a href='"+self.Url+"?p=%s'>%s</a></li>" % (i, i)
page_list.append(temp)
if self.currentPage==self.TotalPage:
nex = "<li><a href='#'>下一页</a></li>"
else:
nex="<li><a href='"+self.Url+"?p=%s'>下一页</a></li>"%(self.currentPage+1,)
page_list.append(nex)
last = "<li><a href='"+self.Url+"?p=%s'>尾页</a></li>"%(self.TotalPage)
page_list.append(last)
return ''.join(page_list)
源码解析:
用的话需要五个参数:
totalCount, currentPage, Url, perPagItemNum=10, maxPagNum=7
分别对应:
数据总总条数,当前页,要跳转的url,每页显示条数,最多显示页码
后两个参数有默认值,所以三个就够
eg:page_obj=Pagination(200,current_page,"/student_manage") 这是下面的函数部分里的
url对应的函数部分:
L = []
for i in range(200):
L.append(i)
def index2(request):
from app01.pager import Pagination
#我这里将组件部分单独放在了一个PY文件里,所以需要导入,写在一起的话就不需要了
try:
current_page = int(request.GET.get("p"))
except Exception:
current_page=1
#获取当前页,第一次的话呈现首页
page_obj=Pagination(200,current_page,"/student_manage")
#使用组件
data_list=L[int(page_obj.Start()):int(page_obj.End())]
#获取这一页的数据内容
return render(request,"index2.html",{"data":data_list,"page_obj":page_obj})
函数部分讲解:
这里为了简便,我用一个L列表代替下数据库来呈现效果,用数据库也是一样的
HTML部分:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css">
</head>
<body>
<ul>
{% for item in data %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{#数据部分#}
<ul class="pagination pagination-sm">
{{ page_obj.page_str | safe }}
</ul>
{#分页部分,呈现的就是上面的效果#}
</body>
</html>
注:这里用了bootstrap里的一个css组件,只需要下载导入即可
再加一张效果图: