ページ付け
Djangoは、ページ付けされたデータ、つまり「前へ/次へ」リンクを使用して複数のページに分割されたデータの管理に役立ついくつかのクラスを提供します。 これらのクラスはdjango/core/paginator.py
にあります。
例
Paginator にオブジェクトのリストと、各ページに配置するアイテムの数を指定します。これにより、各ページのアイテムにアクセスするためのメソッドが提供されます。
ノート
Paginator
にリスト/タプル、Django QuerySet
、またはcount()
または__len__()
メソッドを使用するその他のオブジェクトを指定できることに注意してください。 渡されたオブジェクトに含まれるオブジェクトの数を決定するとき、Paginator
は最初にcount()
の呼び出しを試み、次に渡されたオブジェクトにcount()
がない場合は、len()
の使用にフォールバックします。 ] 方法。 これにより、DjangoのQuerySet
などのオブジェクトは、使用可能な場合、より効率的なcount()
メソッドを使用できます。
ビューでPaginatorを使用する
これは、クエリセットをページ付けするためにビューで Paginator を使用するもう少し複雑な例です。 結果を表示する方法を示すために、ビューと付属のテンプレートの両方を提供します。 この例では、すでにインポートされているContacts
モデルがあることを前提としています。
ビュー関数は次のようになります。
テンプレートlist.html
には、オブジェクト自体からの興味深い情報とともに、ページ間のナビゲーションを含める必要があります。
Paginatorオブジェクト
Paginator クラスには次のコンストラクターがあります。
- class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
必須の引数
object_list
リスト、タプル、
QuerySet
、またはcount()
または__len__()
メソッドを使用するその他のスライス可能なオブジェクト。 一貫したページ付けを行うには、QuerySet
を注文する必要があります。 order_by()句を使用するか、モデルのデフォルトの ordering を使用します。大きな
QuerySet
をページングするパフォーマンスの問題非常に多くのアイテムで
QuerySet
を使用している場合、結果のLIMIT
/OFFSET
クエリは次のことを行う必要があるため、一部のデータベースでは高いページ番号のリクエストが遅くなる可能性があります。OFFSET
レコードの数を数えます。これは、ページ番号が大きくなるにつれて時間がかかります。per_page
孤立を含まない、ページに含めるアイテムの最大数(以下の
orphans
オプションの引数を参照)。
オプションの引数
orphans
- アイテムが非常に少ない最後のページを作成したくない場合に使用します。 通常、最後のページに
orphans
以下のアイテムが含まれている場合、それらのアイテムは、アイテムを単独でページに残すのではなく、前のページ(最後のページになります)に追加されます。 。 たとえば、per_page=10
とorphans=3
の23個のアイテムでは、2つのページがあります。 最初のページには10個のアイテムがあり、2番目(および最後)のページには13個のアイテムがあります。orphans
のデフォルトはゼロです。これは、ページが結合されることはなく、最後のページに1つのアイテムが含まれる可能性があることを意味します。 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 オブジェクトを返します。 指定されたページ番号が存在しない場合、 InvalidPage を発生させます。
属性
- 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例外
- exception InvalidPage
- ページネーターに無効なページ番号が渡されたときに発生する例外の基本クラス。
Paginator.page()メソッドは、要求されたページが無効(つまり、整数ではない)であるか、オブジェクトが含まれていない場合に例外を発生させます。 通常、InvalidPage
例外をキャッチするだけで十分ですが、より細かくしたい場合は、次のいずれかの例外をキャッチできます。
- exception PageNotAnInteger
page()
に整数以外の値が指定された場合に発生します。
- exception EmptyPage
page()
に有効な値が指定されているが、そのページにオブジェクトが存在しない場合に発生します。
どちらの例外も InvalidPage のサブクラスであるため、単純なexcept InvalidPage
で両方を処理できます。
Pageオブジェクト
通常、Page
オブジェクトを手動で作成することはありません。 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 オブジェクト。