zoukankan      html  css  js  c++  java
  • 19:django 分页

    分页是网站中比较常见的应用,django提供了一些类帮助管理分页的数据,这些类都位于django.core.paginator.py文件里面

    分页类

    构造函数

    class Paginator(object_listper_pageorphans=0allow_empty_first_page=True)

    必需参数:

    object_list:具有count()或者__len__()方法的可切片的对象,比如列表,元组或者django queryset

    per_page:每页最大的条目数量

    可选参数:

    • orphans:orphan是孤儿的意思,这个参数指明最后一页的最少条目数字是多少,默认是0。假如orphans是3,你的最后一页只有两个条目,那么这两个条目将会被并到前一页去,而不会形成”孤儿“(最后一个太少条目) 
    • allow_empty_first_page:是否允许第一页是空(没有一个条目),如果是假,那么当object_list是空的时候,抛出EmptyPage的错误

    方法

    • Paginator.page(number):返回一个页对象(从1开始算起),如果不存在抛出一个InvalidPage异常

    属性

    • Paginator.count:object_list中的条目的总条数
    • Paginator.num_pages:总页数
    • Paginator.page_range:页范围,从1开始算起,例如:[1,2,3,4]

    InvalidPage 异常

    有三个异常,InvalidPage,PageNotAnInteger和EmptyPage,看下面的代码即可以知道他们之间的关系

    class InvalidPage(Exception):
        pass
    
    class PageNotAnInteger(InvalidPage):
        pass
    
    class EmptyPage(InvalidPage):
        pass

    页类

    Paginator.page()函数返回一个页对象,类原型是class Page(object_list,number,paginator)

    方法

    • Page.has_next():如果还有下一页,返回真
    • Page.has_previous():如果有前一页,返回真
    • Page.has_other_pages():如果还有前一页或者下一页,返回真
    • Page.next_page_number():返回下一页的页码,不管下一页是否存在
    • Page.previous_page_number():返回前一页的页码,不管前一页是否存在
    • Page.start_index():当前页的元素的开始编号,例如5个元素每两个元素一页,那么共有三页,第二页的start_index()是3
    • Page.end_index():当前页的元素的结束编号,例如5个元素每两个元素一页,那么共有三页,第二页的end_index()是4

    属性

    • Page.object_list:这一页上的元素的形成的列表
    • Page.number:当前页的页码
    • Page.Paginator:关联的Paginator对象

    最后我们看一下应用的例子吧:

    视图函数:

    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def listing(request):
        contact_list = Contacts.objects.all()
        paginator = Paginator(contact_list, 25) # Show 25 contacts per page
    
        page = request.GET.get('page')
        try:
            contacts = paginator.page(page)
        except PageNotAnInteger:
            # If page is not an integer, deliver first page.
            contacts = paginator.page(1)
        except EmptyPage:
            # If page is out of range (e.g. 9999), deliver last page of results.
            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>
  • 相关阅读:
    Index(4.3)
    第七次会议(4.22)
    第六次会议(4.15)
    第五次会议(4.8)
    第四次会议(4.2)
    第三次会议(3.25)
    第二次扩大会议(3.19)
    第二次会议(3.25)
    第一次会议(3.11)
    牛客练习赛25A求1-x因数和(离散求和)
  • 原文地址:https://www.cnblogs.com/qwj-sysu/p/4219775.html
Copyright © 2011-2022 走看看