django自带分页器,当我们使用时需要先将其导入之后,使用用法如下
#views.py
#导入Paginator
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger,InvalidPage
# 在这里我封装了分页器,避免代码太多重复,在需要使用的地方调用即可
def paginator(request,obj_data):
"""
obj_data是需要分页的数据
"""
paginator = Paginator(obj_data,13) #创建分页器
current_page = request.GET.get("page",1) #获取页面分页器传来的GET参数,此时还是字符串
page = int(current_page) #将字符串转化为整数
# 固定显示7页,当大于7页时
if paginator.num_pages > 7:
if page-3 < 1:
#当页面输入前三页时,使其分页器只显示前7页不变
pageRange = range(1,8)
elif page+3 > paginator.num_pages:
#当页面处于最后三页时,使分页器只显示最后固定7页
pageRange = range(paginator.num_pages-6,paginator.num_pages+1)
else:
pageRange = range(page-3,page+4)
else:
pageRange = paginator.page_range
try:
obj_list = paginator.page(page)
except PageNotAnInteger:
obj_list = paginator.page(1)
except InvalidPage:
return HttpResponse('error')
except EmptyPage:
obj_list = paginator.page(paginator.num_pages)
return {"pageRange":pageRange,"obj_list":obj_list}
接下来在前端页面将分页器获取并展示,分页器的样式是导入了layui的样式,代码如下
<div class="page">
<div id="pages" class="text-center">
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
{% if obj_list.has_previous %} #此处是判断是否有下一页
<a class="active" href="?page={{ obj_list.previous_page_number }}">«</a>
{% endif %}
</li>
{% if obj_list.paginator.page_range|length != 1 %} #判断分页器的长度是否为1页
{% for page_num in pageRange %}
{% if page_num == obj_list.number %} #判断当前点击是否为当前页,不为当前页则跳转至点击页面
<li class="active">
<a href="#" style="background-color: cadetblue;">{{ page_num }}</a>
</li>
{% else %}
<li>
<a href="?page={{ page_num }}">{{ page_num }}</a>
</li>
{% endif %}
{% endfor %}
{% endif %}
<li>
{% if obj_list.has_next %} #判断是否有下一页
<a class="active" href="?page={{ obj_list.next_page_number }}">»</a>
{% endif %}
</li>
</ul>
</nav>
</div>
</div>```