使用Django的分页插件进行分页

444 阅读2分钟

page.jpg 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>