分頁器

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.per_page

必要。每個頁面要包含的最大項目數,不包括孤立項目(請參閱下方的 orphans 可選參數)。

Paginator.orphans

選用。當您不希望最後一頁只有非常少的項目時,請使用此參數。如果最後一頁的項目數通常小於或等於 orphans,則這些項目將被添加到前一頁(成為最後一頁),而不是將這些項目單獨留在一個頁面上。例如,如果有 23 個項目,per_page=10orphans=3,則會有兩頁;第一頁有 10 個項目,第二頁(也是最後一頁)有 13 個項目。orphans 預設為零,表示頁面永遠不會合併,並且最後一頁可能只有一個項目。

Paginator.allow_empty_first_page

選用。是否允許第一頁為空。如果 Falseobject_list 為空,則會引發 EmptyPage 錯誤。

Paginator.error_messages
Django 5.0 的新功能。

error_messages 參數讓您可以覆寫分頁器會引發的預設訊息。傳入一個字典,其鍵與您要覆寫的錯誤訊息相符。可用的錯誤訊息鍵為:invalid_pagemin_pageno_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_sideon_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() 返回的頁碼範圍中,用作省略號的替代字串,此字串可翻譯。預設值為 '…'

Paginator.count[原始碼]

所有頁面中的物件總數。

注意

當決定 object_list 中包含的物件數量時,Paginator 會先嘗試呼叫 object_list.count()。如果 object_list 沒有 count() 方法,則 Paginator 會回退使用 len(object_list)。這允許像是 QuerySet 等物件,在可用時使用更有效率的 count() 方法。

Paginator.num_pages[原始碼]

總頁數。

Paginator.page_range[原始碼]

頁碼從 1 開始的範圍迭代器,例如產生 [1, 2, 3, 4]

Page 類別

您通常不會手動建構 Page 物件 – 您會透過迭代 Paginator 或使用 Paginator.page() 來取得它們。

class Page(object_list, number, paginator)[原始碼]

在使用 len() 或直接迭代時,頁面會像 Page.object_list 的序列一樣運作。

方法

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 開始的索引,相對於分頁器列表中的所有物件。例如,當對一個包含 5 個物件的列表進行分頁,每頁 2 個物件時,第二頁的 start_index() 將返回 3

Page.end_index()[原始碼]

返回頁面上最後一個物件的從 1 開始的索引,相對於分頁器列表中的所有物件。例如,當對一個包含 5 個物件的列表進行分頁,每頁 2 個物件時,第二頁的 end_index() 將返回 4

屬性

Page.object_list

此頁面上的物件列表。

Page.number

此頁面從 1 開始的頁碼。

Page.paginator

相關聯的 Paginator 物件。

例外

exception InvalidPage[原始碼]

當分頁器接收到無效的頁碼時引發的異常的基底類別。

如果請求的頁面無效(即不是整數)或不包含任何物件,則 Paginator.page() 方法會引發例外。一般而言,捕獲 InvalidPage 異常就足夠了,但是如果您想要更精細的控制,您可以捕獲以下任一異常

exception PageNotAnInteger[原始碼]

page() 被賦予非整數的值時引發。

exception EmptyPage[原始碼]

page() 被賦予有效的值,但該頁面上不存在任何物件時引發。

這兩個例外都是 InvalidPage 的子類別,因此您可以使用 except InvalidPage 來處理它們。

返回頂部