分页

分页是指在web页面有大量数据需要显示时,当一页的内容太多不利于阅读和不利于数据提取的情况下,可以分为多页进行显示。

Django提供了一些类来帮助你管理分页的数据 — 也就是说,数据被分在不同页面中,并带有“上一页/下一页”链接。

这些类位于django/core/paginator.py中。

一Paginator对象

1.对象的构造方法

  • Paginator(object_list, per_page)
  • 参数
    • object_list 对象列表
    • per_page 每页数据个数
  • 返回值:
    • 分页对象

2.Paginator属性

  • count:对象总数
  • num_pages:页面总数
  • page_range:从1开始的range对象, 用于记录当前面码数
  • per_page 每页个数

3.Paginator方法

Paginator.page(number)

  • 参数 number为页码信息(从1开始)
  • 返回当前number页对应的页信息
  • 如果提供的页码不存在,抛出InvalidPage异常

4.Paginator异常exception

  • InvalidPage:当向page()传入一个无效的页码时抛出
  • PageNotAnInteger:当向page()传入一个不是整数的值时抛出
  • EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出

二Page对象

创建对象 Paginator对象的page()方法返回Page对象,不需要手动构造

1.Page对象属性

  • object_list:当前页上所有对象的列表
  • number:当前页的序号,从1开始
  • paginator:当前page对象相关的Paginator对象

2.Page对象方法

  • has_next():如果有下一页返回True
  • has_previous():如果有上一页返回True
  • has_other_pages():如果有上一页或下一页返回True
  • next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
  • previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
  • len():返回当前页面对象的个数

3.说明

  Page 对象是可迭代对象,可以用 for 语句来 访问当前页面中的每个对象

参考文档https://docs.djangoproject.com/en/1.11/topics/pagination/

分页示例:

视图函数

def book(request):
    bks = models.Book.objects.all()
    paginator = Paginator(bks, 10)
    print('当前对象的总个数是:', paginator.count)
    print('当前对象的面码范围是:', paginator.page_range)
    print('总页数是:', paginator.num_pages)
    print('每页最大个数:', paginator.per_page)

    cur_page = request.GET.get('page', 1)  # 得到默认的当前页
    page = paginator.page(cur_page)
    return render(request, 'bookstore/book.html', locals())
视图函数

模板设计

<html>
<head>
    <title>分页显示</title>
</head>
<body>
{% for b in page %}
    <div>{{ b.title }}</div>
{% endfor %}

{# 分页功能 #}
{# 上一页功能 #}
{% if page.has_previous %}
<a href="{% url "book" %}?page={{ page.previous_page_number }}">上一页</a>
{% else %}
上一页
{% endif %}

{% for p in paginator.page_range %}
    {% if p == page.number %}
        {{ p }}
    {% else %}
        <a href="{% url "book" %}?page={{ p }}">{{ p }}</a>
    {% endif %}
{% endfor %}

{#下一页功能#}
{% if page.has_next %}
<a href="{% url "book" %}?page={{ page.next_page_number }}">上一页</a>
{% else %}
上一页
{% endif %}
总页数: {{ page.len }}
</body>
</html>
模板设计

 

posted @ 2019-07-25 20:27  maplethefox  阅读(604)  评论(0编辑  收藏  举报