Django提供了一些類來幫助您管理分頁數據 - 即分佈在多個頁面上的數據,使用「上一頁/下一頁」連接。這些課程都在django/core/paginator.py
。html
給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">« 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 »</a> {% endif %} </span> </div>
Paginator
objects¶該Paginator
班有這樣的構造函數:函數
object_list
QuerySet
帶有count()
或__len__()
方法的列表,元組或其餘可切片對象。對於一致的分頁,QuerySet
應該對s進行排序,例如使用模型中的order_by()
子句或默認值ordering
。性能
分散大QuerySet
s的性能問題ui
若是您使用的是QuerySet
具備大量項目的項目,則在某些數據庫上請求高頁碼可能會很慢,由於結果LIMIT
/ OFFSET
查詢須要計算OFFSET
在頁碼數愈來愈高時須要更長時間的 記錄數。this
per_page
orphans
下面的可選參數)。
orphans
orphans
,那麼這些項目將被添加到上一頁面(成爲最後一頁),而不是將這些項目本身留在頁面上。例如,有23個項目,
per_page=10
和
orphans=3
,將有兩個頁面; 第一頁有10個項目,第二頁(和最後一頁)有13個項目。
orphans
默認爲零,這意味着頁面永遠不會合並,最後一頁可能有一個項目。
allow_empty_first_page
False
和
object_list
空,則會引起
EmptyPage
錯誤。
InvalidPage
exceptions¶Paginator.page()
若是請求的頁面無效(即,不是整數)或不包含任何對象,則該方法引起異常。一般,它足以捕獲InvalidPage
異常,但若是您想要更多粒度,則能夠捕獲如下任一異常:
這兩個例外都是子類InvalidPage
,因此你能夠用簡單的方法處理它們。except InvalidPage
Page
objects¶您一般不會Page
手工構建對象 - 您將使用它們Paginator.page()
。
Page
(
object_list
,
number
,
paginator
)
[source]
¶
頁面的做用相似於直接Page.object_list
使用 len()
或迭代它的順序。
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
。