revision-up-to: | 8961 (1.0) |
---|
Django は、ページ分割された (paginated) データを扱うためのペジネータ (paginator) クラスを提供しています。ページ分割とは、データが複数のページに わたって表示され、それぞれのページに「前へ/次へ」といったリンクがある状態 を指します。ペジネータのクラスは、 django/core/paginator.py モジュー ルで定義されています。
ペジネータを使うには、まず Paginator クラスにオブジェクトのリスト と、各ページに表示したい要素数を指定してインスタンスを生成します。生成され るインスタンスは、各ページの要素にアクセスするためのメソッドを提供していま す:
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)
>>> p.count
4
>>> p.num_pages
2
>>> p.page_range
[1, 2]
>>> 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()
3
>>> 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
Note
Paginator にはリストやタプル、 Django の QuerySet の他に、 count() や __len__() をメソッドを備えた任意のオブジェクトを渡せ ることに注意してください。 Paginator は、渡されたコンテナ内のオブジェ クトの数を調べるのに、まず count() を呼び出そうとし、 count() がなければ len() にフォールバックします。これにより、 QuerySet のようなオブジェクトで、より効率的な count() を呼び出しています。
Paginator クラスは、以下のようなコンストラクタを持っています:
全てのページにわたるオブジェクトの合計数です。
Note
object_list に入っているオブジェクトの個数を調べるときに、 Paginator はまず object_list.count() を呼びます。 object_list に count() メソッドがなければ、 Paginator は object_list.__len__() に切り替えます。これにより、 QuerySet のようなオブジェクトで、より効率的な count() を呼 び出しているのです。
リクエストされたページが無効なページ (整数でないページ番号) であったり、ペー ジにオブジェクトが含まれていない場合、 page() メソッドは InvalidPage を送出します。通常はこの InvalidPage 例外をトラップする だけですみますが、より細かく例外処理するには、以下の例外をトラップしてくだ さい:
どちらの例外も InvalidPage のサブクラスなので、単に except InvalidPage としておけば両方の例外を捕捉できます。
Aug 31, 2012