Django - 分页

Paginator 对象

  • 创建对象
    • Paginator (数据集合,int)
    • 返回分页对象,参数 1 为要分页的数据集合,参数 2 为每页有几条数据
  • 属性:
    • count:对象总数
    • num_pages:页码数
    • page_range:页码列表,从 1 开始
  • 方法:page(num)
    • num 是页码,从 1 开始。会创建一个 page 对象,该对象存储当前页码的数据,如果页码不存在会抛出 InvalidPage 异常
  • 异常:
    • InvalidPage:当向 page () 传递一个无效的页码时抛出
    • PageNotAnInteger:当向 page () 传递一个不是整数的值时抛出
    • EmptyPage:当向 page () 提供了一个有效值,但是那个页码上没有任何的对象时抛出

Page 对象

  • 创建对象:Paginator 对象的 page () 方法返回 Page 对象,不需要手动构建
  • 属性:
    • object_list:当前页上的所有对象列表
    • number:当前页的页码,从 1 开始
    • paginator
      • 当前 page 对象的相关的 Paginator 对象
      • 注意:一个 paginator 对象使用 page () 函数创建了一个 page 对象,该 page 对象中有一个 paginator 属性,该属性引用了创建该 page 对象的那个 paginator 对象
  • 方法:
    • has_next():如果有下一页返回 True
    • has_previous():如果有上一页返回 True
    • has_other_pages():如果有上一页或者下一页返回 True
    • next_page_number():返回下一页的页码,如果下一页不存在抛出 InvalidPage 异常
    • previous_page_number():返回上一页的页码,如果上一页不存在抛出 InvalidPage 异常
    • len():返回上一页的页码,如果上一页不存在抛出 InvalidPage 异常

示例

  • 视图:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from django.core.paginator import Paginator


    def students(request, num):
    allStus = Student.objects.all()
    # 每页分6条数据
    paginator = Paginator(allStus, 6)
    stus = paginator.page(num)
    print(stus)
    print(type(stus))
    print(stus.object_list)
    print(type(stus.object_list))

    return render(request, "myApp/students.html", {"stus": stus})
  • 模板:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>学生信息</title>
    </head>
    <body>
    <ul>
    {% for stu in stus %}
    <li>{{ stu.name }}--{{ stu.grade }}--{{ stu.age }}</li>
    {% endfor %}
    </ul>

    {% if stus.has_previous %}
    <a href="/students/{{ stus.previous_page_number }}/">上一页</a>
    {% endif %}

    {% for index in stus.paginator.page_range %}
    {% if index == stus.number %}
    {{ index }}
    {% else %}
    <a href="/students/{{ index }}/">{{ index }}</a>
    {% endif %}
    {% endfor %}

    {% if stus.has_next %}
    <a href="/students/{{ stus.next_page_number }}/">下一页</a>
    {% endif %}
    </body>
    </html>
  • url:

    1
    2
    3
    4
    urlpatterns = [
    url(r'^$', views.index),
    url(r'^students/(\d+)/$', views.students),
    ]

paginator 对象与 page 对象的关系

关系

------------- 本文结束 感谢您的阅读 -------------
正在加载今日诗词....