
1 Paginator
Paginator 类的作用是将我们需要分页的数据分割成若干份。当我们实现化一个 Paginator 类的实例时,需要给 Paginator 传入两个参数。第一个参数是数据源,可以是一个列表、元组、以及查询结果集 QuerySet。第二个参数需要传入一个整数,表示每页显示数据条数。
另外 Paginator 类中有三个常用的属性,它们分别是:
count:表示所有页面的对象总数。
num_pages: 表示页面总数。
page_range: 下标从 1 开始的页数范围迭代器。
2 Page 对象
Paginator 类提供一个** page(number) **函数,该函数返回就是一个 Page 对象。参数 number 表示第几个分页。如果 number = 1,那么 page() 返回的对象是第一分页的 Page 对象。在前端页面中显示数据,我们主要的操作都是基于 Page 对象。
Page 对象有三个常用的属性:
object_list: 表示当前页面上所有对象的列表。
numberv: 表示当前页的序号,从 1 开始计数。
paginator: 当前 Page 对象所属的 Paginator 对象。
除此之外,Page 对象还拥有几个常用的函数:
has_next(): 判断是否还有下一页,有的话返回True。
has_previous():判断是否还有上一页,有的话返回 True。
has_other_pages():判断是否上一页或下一页,有的话返回True。
next_page_number(): 返回下一页的页码。如果下一页不存在,抛出InvalidPage 异常。
previous_page_number():返回上一页的页码。如果上一页不存在,抛出InvalidPage 异常。
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.http import HttpResponse
from django.shortcuts import render
from .models import *
def show_view(request):
# 获取当前页码数
num = request.GET.get('num', 1)
n = int(num)
# 1.查询stu_student表中的所有数据
stus = Student.objects.all() # 获取所有的
# django 分页
pager = Paginator(stus, 2)
# 获取当前页面的数据
try:
perpage_data = pager.page(n)
# 返回第一页的数据
except PageNotAnInteger:
perpage_data = pager.page(1)
# 返回最后一页的数据
except EmptyPage:
perpage_data = pager.page(pager.num_pages)
return render(request, 'show.html', {'show': stus, 'pager': pager, 'perpage_data': perpage_data})
<div class="container">
<h4 class="mb-12">全部学生</h4>
<table class="table table-sm">
<thead>
<tr>
<th scope="col">编号</th>
<th scope="col">姓名</th>
<th scope="col">密码</th>
</tr>
</thead>
<tbody>
{% for stu in perpage_data %}
<tr>
<th scope="row">{{ stu.id }}</th>
<td>{{ stu.username }}</td>
<td>{{ stu.password }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
{% if perpage_data.has_previous %}
<li class="page-item">
<a class="page-link" href="/show/?num={{ perpage_data.previous_page_number }}">上一页</a>
</li>
{% endif %}
{% for n in pager.page_range %}
{% if n < 5 %}
<li class="page-item"><a class="page-link" href="/show/?num={{ n }}">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if perpage_data.has_next %}
<li class="page-item">
<a class="page-link" href="/show/?num={{ perpage_data.next_page_number }}">下一页</a>
</li>
{% endif %}
</ul>
</nav>
</div>
网友评论