django 分页


数据多了在一页全部显示不仅不美观,也给服务器带来很大压力。django提供了分页的工具,那就是paginator类,下面来看看该怎么用:

首先要导入该类:

from django.core.paginator import Paginator

认识Paginator类

class Paginator(object_list, per_page,orphans=0,allow_empty_first_page = True)

必需参数:

其中object_list可以是列表,元组,Django 查询集,或者其他有count()和__len__()方法的可切分对象

per_page指每页显示的最大数量

可选参数

orphans最后一页允许显示的最小数量,默认值为0,主要作用是防止最后一页显示的数量太少,

若数量小于orphans规定的值,则在前一页显示。

allow_empty_first_page是否允许第一页是空的

方法:

Paginator.page(number) 返回指定页的对象

属性:

Paginator.count 所有对象的数量

Paginator.num_pages 分页后的总页数

Paginator.page_range 从1开始的页码的区间如[1,2,3,4]

 

通过Paginator.page(number)可以获取Page对象

Page对象一般不手动生成

方法

Page.has_next() 返回True如果还有下一页

Page.has_previous() 返回True如果还有上一页

Page.has_other_pages()返回True如果还有上一页或下一页

Page.next_page_number()返回下一页的页码,有风险,即使不存在也会返回

Page.previous_page_number()返回前一页的页码,有风险,即使不存在也会返回

Page.start_index()返回当前页的第一个对象

Page.end_index()返回当前页的最后一个对象

属性

Page.object_list 一页中包含的项目的列表

Page.number 一页中包含的项目数量

Page.paginator 对应的Paginator对象

 

基础知识学完了以后来看个例子:

在视图中使用Paginator

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def listing(request):
    contact_list = Contacts.objects.all()
    p = Paginator(contact_list , 25)
    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # 如果页码不是整数,返回第一页.
        contacts = paginator.page(1)
    except EmptyPage:
        # 如果页码不在范围内,返回最后一页
        contacts = paginator.page(paginator.num_pages)
    return render_to_response('list.html', {"contacts": contacts})
 
再看看与此对应的模版该怎么写:
{% for contact in contacts %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br />
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if contacts.has_previous %}
            <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>
        {% endif %}
    </span>
</div>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值