一、分页器
语法
from django.core.paginator import Paginator
#复制代码
#Paginator对象:
paginator = Paginator(user_list, 10)
# per_page: 每页显示条目数量
# count: 数据总个数
# num_pages:总页数
# page_range:总页数的索引范围,如: (1,10),(1,200)
# page: page对象
page对象:page=paginator.page(1)
# has_next 是否有下一页
# next_page_number 下一页页码
# has_previous 是否有上一页
# previous_page_number 上一页页码
# object_list 分页之后的数据列表
# number 当前页
# paginator paginator对象
案例一:基础分页器
视图层
from django.shortcuts import render,HttpResponse
from app01 import models
from django.core.paginator import Paginator,EmptyPage
# Create your views here.
def page(request):
# 批量生成数据,并放入列表
# books=[]
# for i in range(100):
# books.append(models.Book(name='书%s'%i,price=i))
# 批量导入数据
# models.Book.objects.bulk_create(books)
books = models.Book.objects.all()
#Paginator:object_list:对象列表, per_page:每页显示的条数
#生成一个Paginator对象
paginator = Paginator(books,10)
#捕获异常就从第一页显示
try:
#从前端GET拿到页面的p
current_page_num = int(request.GET.get('p'))
#current_page:是一个page对象,可以被循环,循环出来的是当前页的内容
current_page=paginator.page(current_page_num)
except Exception as e:
current_page_num = 1
current_page = paginator.page(current_page_num)
return render(request,'page.html',locals())
模板层
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<div class=" col-md-offset-3 col-md-6">
<table class='table table-striped' border="1">
<thead>
<tr>
<th>书名</th>
<th>价格</th>
</tr>
</thead>
<tbody>
<!--current_page:是可以被循环的,循环出来的是当前页的内容,相当于book对象-->
{% for book in current_page %}
<tr>
<td>{{ book.name }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<nav aria-label="Page navigation">
<ul class="pagination">
<!-- page对象.has_previous:判断当前页是否存在上一页,返回True/False
page对象.previous_page_number:上一页的页码 -->
{% if current_page.has_previous %}
<li>
<a href="/page/?p={{ 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 %}
<!-- Paginator对象.page_range:总页数的范围,range(1, 11) -->
{% for num in paginator.page_range %}
<!-- page对象.number:当前页码 -->
{% if num == current_page.number %}
<li class="active"><a href="/page/?p={{ num }}">{{ num }}</a></li>
{% else %}
<li><a href="/page/?p={{ num }}">{{ num }}</a></li>
{% endif %}
{% endfor %}
<!-- page对象.has_next:判断当前页是否存在下一页,返回True/False
page对象.next_page_number:下一页的页码-->
{% if current_page.has_next %}
<li>
<a href="/page/?p={{ 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>
</div>
</body>
</html>
案例二:加强版的分页器
要求:当页码数超过11时;左右显示各5个。
视图层
def page2(request):
books = models.Book.objects.all()
paginator = Paginator(books,3)
try:
current_page_num = int(request.GET.get('p'))
current_page=paginator.page(current_page_num)
#判断总页数是否超过10
if paginator.num_pages >10:
# 当前页码数-5大于1的时候,page_range最小是1,不会再超出
if current_page_num-5<1:
page_range = range(1, 12)
# 当前页码数+5大于总页码数,page_range最大是paginator.num_pages+1
elif current_page_num+5>paginator.num_pages:
page_range = range(paginator.num_pages - 10, paginator.num_pages+1)
# 当前页码数在中间,没有靠近1或最后,就只显示左5右5
else:
page_range = range(current_page_num-5,current_page_num+6)
else:
page_range=paginator.page_range
except Exception as e:
current_page_num = 1
current_page = paginator.page(current_page_num)
return render(request, 'page2.html', locals())
模板层
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<div class=" col-md-offset-3 col-md-6">
<table class='table table-striped' border="1">
<thead>
<tr>
<th>书名</th>
<th>价格</th>
</tr>
</thead>
<tbody>
{% for book in current_page %}
<tr>
<td>{{ book.name }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<nav aria-label="Page navigation">
<ul class="pagination">
{% if current_page.has_previous %}
<li>
<a href="/page2/?p={{ 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 %}
<!--唯一改变的地方:
循环的不再是总页码的范围,而是自定义的范围page_range-->
{% for num in page_range %}
{% if num == current_page.number %}
<li class="active" ><a href="/page2/?p={{ num }}" style=" 40px;text-align: center">{{ num }}</a></li>
{% else %}
<li ><a href="/page2/?p={{ num }}" style=" 40px;text-align: center">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if current_page.has_next %}
<li>
<a href="/page2/?p={{ 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>
</div>
</body>
</html>