# Django 分页器的使用pagintor #
>在视图文件下views.py
from django.shortcuts import render, HttpResponse
from slyajax.models import *
from django.core.paginator import Paginator, EmptyPage #调用Paginator方法
def pags(request):
goods_list = Goods.objects.all() #得到QUERYSET列表。
paginator = Paginator(goods_list, 4) #使用Paginator方法得到paginator对象
###### paginator对象的方法 #########
#print(paginator.count) #显示所有数据条数
#print(paginator.page_range) #分页器的页数范围
#print(paginator.num_pages) #分液器总页数
current_page_num = int(request.GET.get('page', 1)) #获得请求的页数,默认值为1,当GET没有值时显示第一页的内容。
#以下是页面显示效果:,当页数大于11页数时,将显示当前页的前5页和后5页的页码,如果选择的页码小于5时,显示的页码为1至11页,如果页码加5大于最大页码数时,显示最后11页的页码。 如果总页数小于11页时就正常显示页码。
if paginator.num_pages > 11:
if current_page_num-5 < 1: #当前页-5如果小于1的话,说明页码已经是小于5的,那么页码范围就显示前11页数。
#这里也可以写成 if current_page_num < 6 。这样显得更容易理解。
current_range = range(1, 11)
elif current_page_num+5 > paginator.num_pages: #当前页码+5大于最大页码时,说明已经到达最后的5页了。那么页码范围就显示后11页数。
#这里也可以写成 elif current_page_num > paginator.num_pages-5 。容易理解。
current_range = range(paginator.num_pages-10, paginator.num_pages+1)
else:
current_range = range(current_page_num-5, current_page_num+6) #显示当前页的前五和后五页码数。
else:
current_range = paginator.page_range #否则正常显示页码数。
try:
current_page = paginator.page(current_page_num) #当页码超出范围时,会抛出异常。
# page1 = paginator.page(1)
# print(page1.object_list)
# for i in page1:
# print(i)
except EmptyPage as e: #异常的解决方案为当前页码内容显示为第一页。
current_page = paginator.page(1)
return render(request, 'pags.html', locals())
####批量对数据库添加数据####
# goods_list = []
# for i in range(100):
# goods = Goods(name='goods%s'%i, price=i*i)
# goods_list.append(goods)
# Goods.objects.bulk_create(goods_list)
####HTML页面的代码为####
<body>
<ul>
{% for goods in current_page %}
<li>{{ goods.name }} | {{ goods.price }}</li>
{% endfor %}
</ul>
<nav aria-label="Page navigation">
<ul class="pagination">
##这里是当页面达到最前页时,向上按钮不可用disabled。这里使用has_previous来获取当前页是否有前页(返回值为布尔型),使用previous_page_number来获取前一页的的页码数。###
{% if current_page.has_previous %}
<li><a href="?page={{ current_page.previous_page_number }}" aria-label="Previous"><span
aria-hidden="true">上一页</span></a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
##当没有前一页时,上一页的标签显示不可用。
{% endif %}
{% for page_nums in current_range %} #获得页码数的显示范围
{% if current_page_num == page_nums %} #当前显示页面的页码设置为active。
<li class="active"><a href="?page={{ page_nums }}">{{ page_nums }}</a></li>
{% else %}
<li><a href="?page={{ page_nums }}">{{ page_nums }}</a></li>
{% endif %}
{% endfor %}
#这里是下一页按钮的设置,使用has_next来获得是否有下一页,用next_page_number来获取下一页的页码数。
{% if current_page.has_next %}
<li><a href="?page={{ current_page.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
{% endif %}
</ul>
</nav>
</body>