python分页组件
导入Pagination
# 1. 在后端视图函数中
def index(request, project_id):
queryset = models.Issues.objects.filter(project_id=project_id) # 从数据库中拿到数据对象
page_object = Pagination(
current_page=request.GET.get('page'), # 拿到前端页码数据
all_count=queryset.count(), # 数据总数
base_url=request.path_info, # 获取url
query_params=request.GET # QueryDict对象,内部含所有当前URL的原条件
)
issues_object_list = queryset[page_object.start:page_object.end]
context = {
'issues_object_list': issues_object_list,
'page_html': page_object.page_html()
}
return render(request, 'index.html', context)
# 2. 前端
.........
.........
<div>
{% for item in issues_object_list %}
{{item.xxx}}
{% endfor %}
{{ page_html }}
</div>
........
........
分页组件代码
from django.utils.safestring import mark_safe
class Pagination(object):
def __init__(self, current_page, all_count, base_url, query_params, per_page=30, pager_page_count=11):
"""
分页初始化
:param current_page: 当前页码
:param per_page: 每页显示数据条数
:param all_count: 数据库中总条数
:param base_url: 基础URL
:param query_params: QueryDict对象,内部含所有当前URL的原条件
:param pager_page_count: 页面上最多显示的页码数量
"""
self.base_url = base_url
try:
self.current_page = int(current_page)
if self.current_page <= 0:
self.current_page = 1
except Exception as e:
self.current_page = 1
query_params = query_params.copy()
query_params._mutable = True
self.query_params = query_params
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:
"""
if self.all_count == 0:
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 = []
# 首页
self.query_params['page'] = 1
first_page_html = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="{1}?{0}" aria-label="Previous"><span aria-hidden="true">首页</span></a></li>' \
.format(self.query_params.urlencode(), self.base_url)
page_list.append(first_page_html)
# 上一页
if self.current_page <= 1:
prev = '<li><a href="#"><i class="fa fa-angle-double-left" aria-hidden="true"></i> 上一页</a></li>'
else:
self.query_params['page'] = self.current_page - 1
prev = '<li><a href="%s?%s"><i class="fa fa-angle-double-left" aria-hidden="true"></i> 上一页</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="#">下一页 <i class="fa fa-angle-double-right" aria-hidden="true"></i></a></li>'
else:
self.query_params['page'] = self.current_page + 1
nex = '<li><a href="%s?%s">下一页 <i class="fa fa-angle-double-right" aria-hidden="true"></i></a></li>' % (self.base_url, self.query_params.urlencode(),)
page_list.append(nex)
# 尾页
self.query_params['page'] = self.pager_count
last_page_html = '<li><a href="{0}?{1}" aria-label="Previous"><span aria-hidden="true">尾页</span></a></li>' \
.format(self.base_url, self.query_params.urlencode())
page_list.append(last_page_html)
# 共xx条数据,页码x/x页
if self.all_count:
tpl = "<li class='disabled'><a>共 %s 条数据,页码 %s/%s 页</a></li></ul></nav>" % (
self.all_count, self.current_page, self.pager_count,)
page_list.append(tpl)
page_str = "".join(page_list)
return mark_safe(page_str)
(完!)