自定义分页器代码封装
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 ""
if self
.pager_count
< self
.pager_page_count
:
pager_start
= 1
pager_end
= self
.pager_count
else:
if self
.current_page
<= self
.half_pager_page_count
:
pager_start
= 1
pager_end
= self
.pager_page_count
else:
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
)
if self
.all_count
:
tpl
= "<li class='disabled'><a>共%s条数据,页码%s/%s页</a></li>" % (
self
.all_count
, self
.current_page
, self
.pager_count
,)
page_list
.append
(tpl
)
page_str
= "".join
(page_list
)
return page_str
使用自定义分页器
1:后端
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
,
query_params
=request
.GET
)
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
, 'issues.html', context
)
2:前端
注意:自定义分页器的样式是基于bootstrap的,请提前导入bootstrap。
{% for item in issues_object_list %}
{{item.xxx}}
{% endfor %}
<nav aria-label="...">
<ul class="pagination" style="margin-top: 0;">
{{ page_html|safe }}
</ul>
</nav>