Paginator —Djangoのドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/paginator
移動先:案内検索

ページネーター

Djangoは、ページ付けされたデータ、つまり「前へ/次へ」リンクを使用して複数のページに分割されたデータの管理に役立ついくつかのクラスを提供します。 これらのクラスは:source: `django / core / paginator.py` にあります。

例については、ページ付けトピックガイドを参照してください。

Paginatorクラス

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)

len()を使用する場合、または直接反復する場合、ページ付けツールはページのシーケンスのように機能します。

バージョン3.1で変更: Paginatorの反復のサポートが追加されました。

Paginator.object_list

必須。 リスト、タプル、QuerySet、またはcount()または__len__()メソッドを使用するその他のスライス可能なオブジェクト。 一貫したページ付けを行うには、QuerySetを注文する必要があります。 order_by()句を使用するか、モデルのデフォルトの ordering を使用します。

大きなQuerySetをページングするパフォーマンスの問題

非常に多くのアイテムでQuerySetを使用している場合、結果のLIMIT / OFFSETクエリは次のことを行う必要があるため、一部のデータベースでは高いページ番号のリクエストが遅くなる可能性があります。 OFFSETレコードの数を数えます。これは、ページ番号が大きくなるにつれて時間がかかります。

Paginator.per_page
必須。 孤立を含まない、ページに含めるアイテムの最大数(以下の孤立オプションの引数を参照)。
Paginator.orphans
オプション。 アイテムが非常に少ない最後のページを作成したくない場合に使用します。 通常、最後のページにorphans以下のアイテムが含まれている場合、それらのアイテムは、アイテムを単独でページに残すのではなく、前のページ(最後のページになります)に追加されます。 。 たとえば、per_page=10orphans=3の23個のアイテムでは、2つのページがあります。 最初のページには10個のアイテムがあり、2番目(および最後)のページには13個のアイテムがあります。 orphansのデフォルトはゼロです。これは、ページが結合されることはなく、最後のページに1つのアイテムが含まれる可能性があることを意味します。
Paginator.allow_empty_first_page
オプション。 最初のページを空にすることができるかどうか。 Falseおよびobject_listが空の場合、EmptyPageエラーが発生します。

メソッド

Paginator.get_page(number)

指定された1ベースのインデックスを持つ Page オブジェクトを返しますが、範囲外および無効なページ番号も処理します。

ページが数字でない場合は、最初のページが返されます。 ページ番号が負の場合、またはページ数より大きい場合は、最後のページが返されます。

Paginator(..., allow_empty_first_page=False)を指定し、object_listが空の場合にのみ、 EmptyPage 例外を発生させます。

Paginator.page(number)
指定された1ベースのインデックスを持つ Page オブジェクトを返します。 numberint()を呼び出して整数に変換できない場合、 PageNotAnInteger を発生させます。 指定されたページ番号が存在しない場合、 InvalidPage を発生させます。
Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2)

バージョン3.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

バージョン3.2の新機能。

get_elided_page_range()によって返されるページ範囲内の省略されたページ番号の代わりに使用される翻訳可能な文字列。 デフォルトは'…'です。

Paginator.count

すべてのページにわたるオブジェクトの総数。

ノート

object_listに含まれるオブジェクトの数を決定するとき、Paginatorは最初にobject_list.count()を呼び出そうとします。 object_listcount()メソッドがない場合、Paginatorlen(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つのオブジェクトでページ分割する場合、2番目のページの start_index()3を返します。
Page.end_index()
ページネーターのリスト内のすべてのオブジェクトを基準にした、ページの最後のオブジェクトの1から始まるインデックスを返します。 たとえば、5つのオブジェクトのリストをページごとに2つのオブジェクトでページ分割する場合、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で両方を処理できます。