Django 专门提供了一个 Paginator 分页类,传给它一组 Objects,指定每页显示的数量就可以了。

在 python shell 中测试

通过交互式命令了解分页器类提供了哪些方法。

>>> from django.core.paginator import Paginator
>>> objs = ['herald', 'jone', 'rita', 'hank', 'lee', 'tank']   
>>> p = Paginator(objs, 2)
>>> p.
p.allow_empty_first_page  p.num_pages               p.page(                   p.validate_number(
p.count                   p.object_list             p.page_range              
p.get_page(               p.orphans                 p.per_page                
>>> p.count
6
>>> p.num_pages
3
>>> p.page_range
range(1, 4)
>>> page1 = p.page(1)
>>> page1
<Page 1 of 3>
>>> page1.object_list
['herald', 'jone']
>>> page2 = p.page(2)
>>> page2.object_list
['rita', 'hank']
>>> page2.
page2.count(                 page2.has_other_pages(       page2.next_page_number(      page2.paginator
page2.end_index(             page2.has_previous(          page2.number                 page2.previous_page_number(
page2.has_next(              page2.index(                 page2.object_list            page2.start_index(
>>> page2.has_next()
True
>>> page2.next_page_number()
3

在视图中使用分页器

from django.core.paginator import Paginator
from django.shortcuts import render

def listing(request):
    # 从数据库中读取所有记录
    contact_list = Contacts.objects.all()
    # 用取回的数据创建分页器,并设置每页显示25条记录
    paginator = Paginator(contact_list, 25)
    
    # 获取当前页码
    page = request.GET.get('page')
    # 用当前页码初始化分页器
    contacts = paginator.get_page(page)
    return render(request, 'list.html', {'contacts': contacts})

模板

{% for contact in contacts %}
    {# 打印已分页的记录 #}
    {{ contact.full_name|upper }}<br>
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {# 使用分页器类提供的方法判断显示分页菜单 #}
        {% if contacts.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ contacts.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
        </span>

        {% if contacts.has_next %}
            <a href="?page={{ contacts.next_page_number }}">next</a>
            <a href="?page={{ contacts.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>