Django之自帶分頁模塊Pagination

Django提供了一些類來幫助您管理分頁數據 - 即分佈在多個頁面上的數據,使用「上一頁/下一頁」連接。這些課程都在django/core/paginator.pyhtml

Example

Paginator對象的列表,再加上你想有每一個頁面上的項目數,和它給你訪問的每一個頁面的項目方法:python

>>> 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已導入的 模型。數據庫

視圖函數以下所示:django

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,您須要在頁面之間包含導航以及來自對象自己的任何有趣信息:less

{% 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班有這樣的構造函數:函數

class Paginator object_list per_page orphans = 0 allow_empty_first_page = True [source]  ¶

必需參數

object_list

QuerySet帶有count() 或__len__()方法的列表,元組或其餘可切片對象對於一致的分頁,QuerySet應該對s進行排序,例如使用模型中的order_by() 子句或默認值ordering性能

分散大QuerySets的性能問題ui

若是您使用的是QuerySet具備大量項目的項目,則在某些數據庫上請求高頁碼可能會很慢,由於結果LIMITOFFSET查詢須要計算OFFSET在頁碼數愈來愈高時須要更長時間的 記錄數。this

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開始的索引對象,同時還處理超出範圍和無效頁碼。spa

若是頁面不是數字,則返回第一頁。若是頁碼爲負數或大於頁數,則返回最後一頁。

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()

class Page object_list number paginator [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對象。

相關文章
相關標籤/搜索