分頁器¶
Django 提供了一些類別來幫助您管理分頁資料 – 也就是將資料分散在多個頁面,並具有「上一頁/下一頁」連結。這些類別位於 django/core/paginator.py 中。
如需範例,請參閱 分頁主題指南。
Paginator
類別¶
- class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None)[原始碼]¶
當使用
len()
或直接迭代時,分頁器的作用類似於Page
的序列。
- Paginator.object_list¶
必要。 列表、元組、
QuerySet
或其他具有count()
或__len__()
方法的可切片物件。為了保持分頁的一致性,QuerySet
應進行排序,例如使用order_by()
子句或模型上的預設ordering
。對大型
QuerySet
進行分頁的效能問題如果您使用的
QuerySet
具有大量的項目,在某些資料庫上要求較高的頁碼可能會很慢,因為產生的LIMIT
/OFFSET
查詢需要計算OFFSET
記錄的數量,而這會隨著頁碼的增加而需要更長的時間。
- Paginator.orphans¶
選用。當您不希望最後一頁只有非常少的項目時,請使用此參數。如果最後一頁的項目數通常小於或等於
orphans
,則這些項目將被添加到前一頁(成為最後一頁),而不是將這些項目單獨留在一個頁面上。例如,如果有 23 個項目,per_page=10
和orphans=3
,則會有兩頁;第一頁有 10 個項目,第二頁(也是最後一頁)有 13 個項目。orphans
預設為零,表示頁面永遠不會合併,並且最後一頁可能只有一個項目。
- Paginator.allow_empty_first_page¶
選用。是否允許第一頁為空。如果
False
且object_list
為空,則會引發EmptyPage
錯誤。
- Paginator.error_messages¶
- Django 5.0 的新功能。
error_messages
參數讓您可以覆寫分頁器會引發的預設訊息。傳入一個字典,其鍵與您要覆寫的錯誤訊息相符。可用的錯誤訊息鍵為:invalid_page
、min_page
和no_results
。例如,這是預設的錯誤訊息
>>> from django.core.paginator import Paginator >>> paginator = Paginator([1, 2, 3], 2) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: That page contains no results
這是自訂的錯誤訊息
>>> paginator = Paginator( ... [1, 2, 3], ... 2, ... error_messages={"no_results": "Page does not exist"}, ... ) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: Page does not exist
方法¶
- Paginator.get_page(number)[原始碼]¶
傳回具有給定 1 為基底的索引的
Page
物件,同時處理超出範圍和無效的頁碼。如果頁面不是數字,則傳回第一頁。如果頁碼為負數或大於頁數,則傳回最後一頁。
僅當您指定
Paginator(..., allow_empty_first_page=False)
且object_list
為空時,才會引發EmptyPage
例外。
- Paginator.page(number)[原始碼]¶
傳回具有給定 1 為基底的索引的
Page
物件。如果number
無法透過呼叫int()
轉換為整數,則會引發PageNotAnInteger
。如果給定的頁碼不存在,則會引發EmptyPage
。
- Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2)[原始碼]¶
傳回類似於
Paginator.page_range
的以 1 為基底的頁碼列表,但當Paginator.num_pages
很大時,可能會在目前頁碼的任一側或兩側新增省略符號。目前頁碼每側要包含的頁數由
on_each_side
參數決定,預設值為 3。在頁面範圍的開頭和結尾要包含的頁數由
on_ends
參數決定,預設值為 2。例如,使用
on_each_side
和on_ends
的預設值,如果目前頁面為 10,並且有 50 頁,則頁面範圍將會是[1, 2, '…', 7, 8, 9, 10, 11, 12, 13, '…', 49, 50]
。這會導致目前頁面左側的頁面 7、8 和 9,以及右側的 11、12 和 13,以及開頭的 1 和 2 以及結尾的 49 和 50。如果給定的頁碼不存在,則會引發
InvalidPage
異常。
屬性¶
- Paginator.ELLIPSIS¶
在
get_elided_page_range()
返回的頁碼範圍中,用作省略號的替代字串,此字串可翻譯。預設值為'…'
。
Page
類別¶
您通常不會手動建構 Page
物件 – 您會透過迭代 Paginator
或使用 Paginator.page()
來取得它們。
- class Page(object_list, number, paginator)[原始碼]¶
在使用
len()
或直接迭代時,頁面會像Page.object_list
的序列一樣運作。
方法¶
- Page.next_page_number()[原始碼]¶
返回下一頁的頁碼。如果下一頁不存在,則會引發
InvalidPage
異常。
- Page.previous_page_number()[原始碼]¶
返回上一頁的頁碼。如果上一頁不存在,則會引發
InvalidPage
異常。
- Page.start_index()[原始碼]¶
返回頁面上第一個物件的從 1 開始的索引,相對於分頁器列表中的所有物件。例如,當對一個包含 5 個物件的列表進行分頁,每頁 2 個物件時,第二頁的
start_index()
將返回3
。
- Page.end_index()[原始碼]¶
返回頁面上最後一個物件的從 1 開始的索引,相對於分頁器列表中的所有物件。例如,當對一個包含 5 個物件的列表進行分頁,每頁 2 個物件時,第二頁的
end_index()
將返回4
。
屬性¶
- Page.object_list¶
此頁面上的物件列表。
- Page.number¶
此頁面從 1 開始的頁碼。
例外¶
如果請求的頁面無效(即不是整數)或不包含任何物件,則 Paginator.page()
方法會引發例外。一般而言,捕獲 InvalidPage
異常就足夠了,但是如果您想要更精細的控制,您可以捕獲以下任一異常
這兩個例外都是 InvalidPage
的子類別,因此您可以使用 except InvalidPage
來處理它們。