zoukankan      html  css  js  c++  java
  • Django之自带分页模块Pagination

    Django提供了一些类来帮助您管理分页数据 - 即分布在多个页面上的数据,使用“上一页/下一页”链接。这些课程都在django/core/paginator.py

    Example

    Paginator对象的列表,再加上你想有每个页面上的项目数,和它给你访问的每个页面的项目方法:

    >>> from django.core.paginator import Paginator
    >>> objects = ['john', 'paul', 'george', 'ringo']
    >>> p = Paginator(objects, 2)
    
    >>> p.count
    4
    >>> p.num_pages
    2
    >>> type(p.page_range)
    <class 'range_iterator'>
    >>> p.page_range
    range(1, 3)
    
    >>> page1 = p.page(1)
    >>> page1
    <Page 1 of 2>
    >>> page1.object_list
    ['john', 'paul']
    
    >>> page2 = p.page(2)
    >>> page2.object_list
    ['george', 'ringo']
    >>> page2.has_next()
    False
    >>> page2.has_previous()
    True
    >>> page2.has_other_pages()
    True
    >>> page2.next_page_number()
    Traceback (most recent call last):
    ...
    EmptyPage: That page contains no results
    >>> page2.previous_page_number()
    1
    >>> page2.start_index() # The 1-based index of the first item on this page
    3
    >>> page2.end_index() # The 1-based index of the last item on this page
    4
    
    >>> p.page(0)
    Traceback (most recent call last):
    ...
    EmptyPage: That page number is less than 1
    >>> p.page(3)
    Traceback (most recent call last):
    ...
    EmptyPage: That page contains no results
    

      

    注意
    
    请注意,您可以使用或方法提供Paginator列表/元组,Django QuerySet或任何其他对象。在确定传递的对象中包含的对象数时, 将首先尝试调用,然后如果传递的对象没有方法则回退到使用 。这允许诸如Django之类的对象 在可用时使用更有效的方法。count()__len__()Paginatorcount()len()count()QuerySetcount()

    Paginator在视图中使用

    这是一个稍微复杂的示例,用于Paginator在视图中对查询集进行分页。我们同时提供视图和附带的模板,以显示如何显示结果。此示例假定您具有Contacts已导入的 模型。

    视图函数如下所示:

    from django.core.paginator import Paginator
    from django.shortcuts import render
    
    def listing(request):
        contact_list = Contacts.objects.all()
        paginator = Paginator(contact_list, 25) # Show 25 contacts per page
    
        page = request.GET.get('page')
        contacts = paginator.get_page(page)
        return render(request, 'list.html', {'contacts': contacts})

    在模板中list.html,您需要在页面之间包含导航以及来自对象本身的任何有趣信息:

    {% 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=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>

    Paginator objects

    Paginator班有这样的构造函数:

    classPaginatorobject_listper_pageorphans = 0allow_empty_first_page = True[source] ¶

    必需参数

    object_list

    QuerySet带有count() 或__len__()方法的列表,元组或其他可切片对象对于一致的分页,QuerySet应该对s进行排序,例如使用模型中的order_by() 子句或默认值ordering

    分散大QuerySets的性能问题

    如果您使用的是QuerySet具有大量项目的项目,则在某些数据库上请求高页码可能会很慢,因为结果LIMITOFFSET查询需要计算OFFSET在页码数越来越高时需要更长时间的 记录数。

    per_page
    页面上包含的最大项目数,不包括孤儿(请参阅orphans下面可选参数)。

    可选参数

    orphans
    如果您不希望最后一页包含很少的项目,请使用此选项。如果最后一页通常具有小于或等于的项目数orphans,那么这些项目将被添加到上一页面(成为最后一页),而不是将这些项目自己留在页面上。例如,有23个项目,per_page=10和 orphans=3,将有两个页面; 第一页有10个项目,第二页(和最后一页)有13个项目。orphans默认为零,这意味着页面永远不会合并,最后一页可能有一个项目。
    allow_empty_first_page
    是否允许第一页为空。如果为False和 object_list空,则会引发EmptyPage错误。

    Methods

    Paginator.get_page编号[来源] ¶

    返回Page具有给定的从1开始的索引对象,同时还处理超出范围和无效页码。

    如果页面不是数字,则返回第一页。如果页码为负数或大于页数,则返回最后一页。

    EmptyPage只有在指定为空时才会引发异常() Paginator(..., allow_empty_first_page=False)object_list

    Paginator.page编号[来源] ¶

    返回Page具有给定的从1开始的索引对象。InvalidPage如果给定的页码不存在则引发 

    Attributes

    Paginator.count

    所有页面中的对象总数。

    注意

    在确定包含的对象数量时object_list, Paginator首先会尝试调用object_list.count()如果 object_list没有count()方法,那么Paginator将回退使用len(object_list)这允许诸如Django之类的对象在可用时QuerySet使用更有效的count()方法。

    Paginator.num_pages

    总页数。

    Paginator.page_range

    基于1的范围的页码迭代器,例如屈服[1, 2, 3, 4]

    InvalidPage exceptions

    异常InvalidPage[来源] ¶

    分页器传递无效页码时引发的异常的基类。

    Paginator.page()如果请求的页面无效(即,不是整数)或不包含任何对象,则方法引发异常。通常,它足以捕获InvalidPage异常,但如果您想要更多粒度,则可以捕获以下任一异常:

    异常PageNotAnInteger[来源] ¶

    page()赋值不是整数时引发。

    异常EmptyPage[来源] ¶

    page()给定有效值但在该页面上不存在对象时引发。

    这两个例外都是子类InvalidPage,所以你可以用简单的方法处理它们except InvalidPage

    Page objects

    您通常不会Page手工构建对象 - 您将使用它们Paginator.page()

    classPageobject_listnumberpaginator[source] ¶

    页面的作用类似于直接Page.object_list使用 len()或迭代它的顺序

    Methods

    Page.has_next()[来源] ¶

    True如果有下一页则返回

    Page.has_previous()[来源] ¶

    True如果有上一页,则返回

    Page.has_other_pages()[来源] ¶

    True如果有下一页上一页,返回

    Page.next_page_number()[来源] ¶

    返回下一页编号。InvalidPage如果下一页不存在则引发

    Page.previous_page_number()[来源] ¶

    返回上一页编号。InvalidPage如果前一页不存在则引发

    Page.start_index()[来源] ¶

    返回页面上第一个对象的从1开始的索引,相对于分页器列表中的所有对象。例如,当为每页包含2个对象的5个对象的列表进行分页时,start_index()将返回第二个页面 3

    Page.end_index()[来源] ¶

    返回页面上最后一个对象的从1开始的索引,相对于分页器列表中的所有对象。例如,当为每页包含2个对象的5个对象的列表进行分页时,end_index()将返回第二个页面 4

    Attributes

    Page.object_list

    此页面上的对象列表。

    Page.number

    此页面的从1开始的页码。

    Page.paginator

    关联的Paginator对象。

  • 相关阅读:
    mysql--SQL编程(关于mysql中的日期) 学习笔记2
    mysql--SQL编程(基础知识) 学习笔记1
    Geocoding java调用百度地图API v2.0 图文 实例( 解决102错误)
    java unicode转码为中文 实例
    spring hiberante 集成出现异常 java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor
    [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction
    [Spring学习笔记 6 ] Spring JDBC 详解
    ubuntu 连接windows远程桌面 &&rdesktop 退出全屏模式
    maven Missing artifact com.sun:tools:jar:1.5.0
    mysql 常用命令,连接数据库,查看建表语句,批量导入数据,批量更新数据,连接查询
  • 原文地址:https://www.cnblogs.com/shuai1991/p/11003878.html
Copyright © 2011-2022 走看看