自定义页码
自定义页码
目的
通过使用Python代码基于BootStrap控件的基础上,实现页码插件的功能
目标
用户输入一些必要的参数,通过这个插件可以获得应该在页面上显示的数据起始位置和结束位置以及页码标签的html代码,该内容只是单纯的页码代码,外面应该自己写上如下代码:
<ul class="pagination" style="margin: 0;">
{{ pager.page_html|safe }}
</ul>
流程
用户实例化这个对象的时候需要传入如下参数:
current_page:当前页码(用户前端点击的页码数字)
all_count:分页之前在页面上一共显示多少条数据
base_url:点击页码后提交的url
query_params:request里GET中的数据,用来保证搜索条件不变
per_page=10:每页最多显示的数据条数,默认为10条
pager_page_count=11:页码器最多展示多少个页码,默认为11个
通过上面参数应该可以获取到以下数据
start 数据索引值的起始索引(分页完成后的)
end 数据索引值得结束索引(分页完成后的)
page_html() 生成HTML的页码 --》可以根据需要,修改这里的标签
代码:
class Page(object):
def __init__(self, current_page, all_count, base_url, query_params, per_page=10, pager_page_count=11):
"""
分页初始化
:param current_page: 当前页码
:param per_page: 每页显示数据条数
:param all_count: 数据库中总条数
:param pager_page_count: 页面上最多显示的页码数量
"""
self.base_url = base_url
self.query_params = query_params
try:
self.current_page = int(current_page)
if self.current_page <= 0:
raise Exception()
except Exception as e:
self.current_page = 1
self.per_page = per_page
self.all_count = all_count
self.pager_page_count = pager_page_count
pager_count, b = divmod(all_count, per_page)
if b != 0:
pager_count += 1
self.pager_count = pager_count
half_pager_page_count = int(pager_page_count / 2)
self.half_pager_page_count = half_pager_page_count
@property
def start(self):
"""
数据获取值起始索引
:return:
"""
return (self.current_page - 1) * self.per_page
@property
def end(self):
"""
数据获取值结束索引
:return:
"""
return self.current_page * self.per_page
def page_html(self):
"""
生成HTML页码
:return:
"""
# 如果数据总页码pager_count<11 pager_page_count
if self.pager_count < self.pager_page_count:
pager_start = 1
pager_end = self.pager_count
else:
# 数据页码已经超过11
# 判断: 如果当前页 <= 5 half_pager_page_count
if self.current_page <= self.half_pager_page_count:
pager_start = 1
pager_end = self.pager_page_count
else:
# 如果: 当前页+5 > 总页码
if (self.current_page + self.half_pager_page_count) > self.pager_count:
pager_end = self.pager_count
pager_start = self.pager_count - self.pager_page_count + 1
else:
pager_start = self.current_page - self.half_pager_page_count
pager_end = self.current_page + self.half_pager_page_count
page_list = []
if self.current_page <= 1:
prev = '<li><a href="#">上一页</a></li>'
else:
self.query_params['page'] = self.current_page - 1
prev = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url,self.query_params.urlencode())
page_list.append(prev)
for i in range(pager_start, pager_end + 1):
self.query_params['page'] = i
if self.current_page == i:
tpl = '<li class="active"><a href="%s?%s">%s</a></li>' % (
self.base_url, self.query_params.urlencode(), i,)
else:
tpl = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.query_params.urlencode(), i,)
page_list.append(tpl)
if self.current_page >= self.pager_count:
nex = '<li><a href="#">下一页</a></li>'
else:
self.query_params['page'] = self.current_page + 1
nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),)
page_list.append(nex)
page_str = "".join(page_list)
return page_str
浙公网安备 33010602011771号