汎用ビュー
| revision-up-to: | 7127 (0.97pre SVN) |
|---|
Web アプリケーションの作成は、同じパターンを何度も何度も繰り返し書くことに なるため、退屈なものです。 Django では、そんなパターンに共通する部分のほと んどを「汎用ビュー (generic view) 」という形で抽象化し、オブジェクトに対し てよく定義されるビューを、 Python コードを一切書かずに作成できるようにして います。
Django の汎用ビューには以下のようなものがあります:
- list/detail インタフェース (たとえば Django の documentation index や detail pages) を実現するビューのセット。
- アーカイブに入っているページ群に対する年/月/日のビューと、各ページの 詳細、そして「新着 (latest)」のページ (例えば Django weblog の year, month, day, detail, latest といったページ)。
- オブジェクトの生成、編集、削除を行うためのビュー。
これらのビューは全て、URLconf ファイルに設定の入った辞書を作成し、 URLconf で URL パターンを記述しているタプルの 3 つめのメンバにその辞書を渡すことで 使えるようになります。例えば、djangoproject.com の blog を駆動している簡単 な weblog アプリのための URLconf を以下に示しましょう:
from django.conf.urls.defaults import *
from django_website.apps.blog.models import Entry
info_dict = {'queryset': Entry.objects.all(),
'date_field': 'pub_date'}
urlpatterns = patterns('django.views.generic.date_based',
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$',
'object_detail', info_dict),
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$',
'archive_day', info_dict),
(r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$',
'archive_month', info_dict),
(r'^(?P<year>\d{4})/$', 'archive_year', info_dict),
(r'^$', 'archive_index', info_dict),
)
御覧のように、 URLconf では、 info_dict にいくつかのオプションを定義し ています。 queryset は汎用ビューに渡すオブジェクトに対する QuerySet (上の場合には Entry オブジェクト全て) です。また、追加の情報 (どのモデ ルを使っているのかをビューに教えるための情報) も定義しています。
以下では、各汎用ビューのドキュメントと、汎用ビューで使われる全てのキーワー ド引数について説明します。上の例では、引数は URL パターンの中にあるもの (month, day, year, など) も、辞書に入っているもの (queryset, date_field など) もあることに注意してください。
ほとんどの汎用ビューで queryset キーが必要です。この値は QuerySet インスタンスです。 QuerySet オブジェクトの詳細は データベース API のドキュメント を参照してください。
ほとんどのビューは、 extra_context というオプションの引数を取れます。こ の引数の値は辞書で、ビューに渡したい任意の外部の情報を渡すためのものです。 extra_context 辞書の値は関数 (や呼び出し可能オブジェクト) でも、それ以 外のオブジェクトでもかまいません。関数はテンプレートに渡される直前に評価さ れます。ただし、 QuerySet は最初に評価した時点でデータを取得してキャッシュ に入れるので、 extra_context を使ってクエリセットを渡し、なおかつ QuerySet を常に最新の状態にしておきたい場合には、関数やラムダ表記を使って QuerySet を返させるようにせねばなりません。
「簡単な」汎用ビュー
django.views.generic.simple モジュールには、簡単なビューが入っていて、 ビューロジックの必要がないときのレンダリングと、リダイレクトの発行という よくある二つのケースを処理できるようになっています:
django.views.generic.simple.direct_to_template
解説:
指定のテンプレートにテンプレート変数 {{ params }} を指定してレンダリン グします。 {{ params }} は URL から取り出したパラメタの辞書になります。
必須の引数:
- template: 使用するテンプレートの完全な名前です。
オプションの引数:
- extra_context: テンプレートコンテキストに追加したい値を入れた辞書 です。辞書内の値が呼び出し可能オブジェクトの場合、ビューはテンプレー トのレンダリング直前にオブジェクトを呼び出します。
- mimetype: 出力結果のドキュメントの MIME タイプです。 デフォルト値は DEFAULT_CONTENT_TYPE 設定の値です。
例題:
例えば、以下のような URL パターンを指定したとしましょう:
urlpatterns = patterns('django.views.generic.simple',
(r'^foo/$',
'direct_to_template', {'template': 'foo_index'}),
(r'^foo/(?P<id>\d+)/$',
'direct_to_template', {'template': 'foo_detail'}),
)
/foo/ へのリクエストは、 foo_index.html テンプレートを使ったレンダ リングになります。一方、 /foo/15/ へのリクエストは foo_detail.html テンプレートを使ったレンダリングになりますが、このときのコンテキスト変数 {{ params.id }} は 15 になります。
django.views.generic.simple.redirect_to
解説:
指定の URL へリダイレクトします。
URL を指定する文字列には、辞書スタイルの文字列フォーマットを含めてもよく、 その場合、 URL 中の該当パラメタで補完されます。
URL に None を指定すると、 HttpResponseGone (410) を発行します。
必須の引数:
- url: リダイレクト先の URL を表す文字列です。 None にすると HTTP 410 エラー (Gone) を送出します。
例題:
以下の例では、 /foo/<id>/ を /bar/<id>/ にリダイレクトします:
urlpatterns = patterns('django.views.generic.simple',
('^foo/(?P<id>\d+)/$', 'redirect_to', {'url' : '/bar/%(id)s/'}),
)
以下の例では、 /bar/ へのリクエストに対して HTTP 410 エラーを返します:
urlpatterns = patterns('django.views.generic.simple',
('^bar/$', 'redirect_to', {'url': None}),
)
日付ベースの汎用ビュー
日付ベースの汎用ビュー (date-based generic view, django.views.generic.date_based モジュール) は、日付ベースのデータを絞 り込めるページを表示するビューです。
django.views.generic.date_based.archive_index
解説:
「新着 ("latest")」オブジェクトを日付順で表示するトップレベルのインデクスペー ジです。 allow_future を True にしない限り、 未来の 日付のオブジェ クトは表示しません。
必須の引数:
- queryset: アーカイブを提供するオブジェクトの QuerySet です。
- date_field: QuerySet に指定したモデルの DateField または DateTimeField 型のフィールド名です。日付ベースのアーカイブで、ペー ジに掲載するオブジェクトを決定するために使います。
オプションの引数:
- num_latest: 最近のオブジェクトとしてテンプレートコンテキストに送 り込まれるオブジェクトの数です。デフォルトは 15 です。
- template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
- template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
- extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
- allow_empty: オブジェクトがない場合にページを表示するかどうかを示 すブール値です。 False の場合、表示するべきオブジェクトが存在しな ければ、空のインデクスページを表示する代わりに 404 エラーを送出します。 デフォルトは True です。
- context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
- mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
- allow_future: 「未来の」オブジェクトをページに表示するかどうかを 制御するブール値です。「未来の」オブジェクトとは、 date_field に 指定したフィールドの値が現在の日/時よりも大きいようなオブジェクトで す。デフォルトでは False です。
- 開発版の Django で登場した機能: template_object_name: テンプレートコンテキストをテンプレート変数として渡すときの名前です。 デフォルト値は 'latest' です。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_archive.html を使います。ここで:
- <model_name> はモデル名を全て小文字にしたものです。例えば StaffMember というモデルの場合は staffmember になります。
- <app_label> はモデルアプリケーションへの Python パスの最も右側の 部分になります。例えば、モデルが apps/blog/models.py に入っていれ ば blog になります。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
date_list: queryset を介してオブジェクトを取得できる年を表す datetime.date オブジェクトのリストです。リストは逆順に並んでいま す。 queryset.dates(date_field, 'year')[::-1] と等価です。
latest: date_field の順に並んだ num_latest 個のオブジェク トです。例えば、 num_latest が 10 であれば、 latest は queryset 内のオブジェクトのうち、最新の 10 個からなるリストです。
開発版の Django で登場した機能: 変数の名前は template_object_name パラメタで変更できます。デフォルト値は 'latest' です。例えば、 template_object_name を 'foo' に したときの変数名は foo です。
django.views.generic.date_based.archive_year
解説:
指定年でオブジェクトのある月のリストを表示する、年ごとのアーカイブページで す。 allow_future を True にしない限り、 未来の 日付のオブジェク トは表示しません。
必須の引数:
- year: アーカイブを提供する年の 4 桁の年号です。
- queryset: アーカイブを提供するオブジェクトの QuerySet です。
- date_field: QuerySet に指定したモデルの DateField または DateTimeField 型のフィールド名です。日付ベースのアーカイブで、ペー ジに掲載するオブジェクトを決定するために使います。
オプションの引数:
- template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
- template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
- extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
- allow_empty: オブジェクトがない場合にページを表示するかどうかを示 すブール値です。 False の場合、表示するべきオブジェクトが存在しな ければ、空のインデクスページを表示する代わりに 404 エラーを送出します。 デフォルトは False です。
- context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
- template_object_name: テンプレートコンテキスト中で使うテンプレー ト変数の名前を指定します。デフォルトでは 'object' です。ビューは このパラメタに '_list' を追加した値を変数名に使います。
- make_object_list: 指定年の全てのオブジェクトのリストを取得してテ ンプレートに渡すかどうかを決めるブール値です。 True にすると、オ ブジェクトのリストを object_list という変数で利用できます (object_list は別の名前になるかもしれません。後述の「テンプレート コンテキスト」の節の object_list の説明を参照してください)。 デフォルトでは False になっています。
- mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
- allow_future: 「未来の」オブジェクトをページに表示するかどうかを 制御するブール値です。「未来の」オブジェクトとは、 date_field に 指定したフィールドの値が現在の日/時よりも大きいようなオブジェクトで す。デフォルトでは False です。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_archive_year.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
date_list: 指定年内で queryset を介してオブジェクトを取得でき る月を表す datetime.date オブジェクトのリストです。リストは昇順に 並んでいます。
year: 指定年の年号を表す 4 桁の文字列です。
object_list: make_object_list パラメタを True にした場合、 この値は指定年内のオブジェクトを日付フィールドで並べたリストになりま す。この変数の名前は template_object_name パラメタの設定に依存し ます。 template_object_name のデフォルト値は 'object' で、例 えば template_object_name の値が 'foo' であれば、変数名は foo_list になります。
make_object_list が False の場合、 object_list は空のリス トとしてテンプレートに渡されます。
django.views.generic.date_based.archive_month
解説:
指定月の全てのオブジェクトのリストを表示する、月ごとのアーカイブページです。 allow_future を True にしない限り、 未来の 日付のオブジェクトは表 示しません。
必須の引数:
- year: アーカイブを提供する年の 4 桁の年号 (の文字列) です。
- month: アーカイブを提供する月のです。 month_format 引数に従っ てフォーマットされています。
- queryset: アーカイブを提供するオブジェクトの QuerySet です。
- date_field: QuerySet に指定したモデルの DateField または DateTimeField 型のフィールド名です。日付ベースのアーカイブで、ペー ジに掲載するオブジェクトを決定するために使います。
オプションの引数:
- month_format: month パラメタで使っているフォーマットを指定す るためのフォーマット文字列です。この値は Python の time.strftime が受け取るのと同じ書法のフォーマット文字列を指定します。 (strftime のドキュメント 参照)。デフォルトでは "%b" に設定さ れており、これは 3 文字で省略して表した月名です。数字を使うように変え たければ "%m" を使って下さい。
- template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
- template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
- extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
- allow_empty: オブジェクトがない場合にページを表示するかどうかを示 すブール値です。 False の場合、表示するべきオブジェクトが存在しな ければ、空のインデクスページを表示する代わりに 404 エラーを送出します。 デフォルトは False です。
- context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
- template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。ビュー はこの変数名に '_list' を追加して変数名を決定します。
- mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
- allow_future: 「未来の」オブジェクトをページに表示するかどうかを 制御するブール値です。「未来の」オブジェクトとは、 date_field に 指定したフィールドの値が現在の日/時よりも大きいようなオブジェクトで す。デフォルトでは False です。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_archive_month.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
- month: 指定月を表す datetime.date オブジェクトです。
- next_month: 次の月の最初の日を表す datetime.date オブジェクト です。次の月が未来の日付の場合には None になります。
- previous_month: 前の月の最初の日を表す datetime.date オブジェクト です。 next_month と違い、決して None にはなりません。
- object_list: 指定月内のオブジェクトからなるリストです。この変数の 名前は template_object_name パラメタの設定に依存します。 template_object_name のデフォルト値は 'object' で、例えば template_object_name の値が 'foo' であれば、変数名は foo_list になります。
django.views.generic.date_based.archive_week
解説:
指定週の全てのオブジェクトのリストを表示する、週ごとのアーカイブページです。 allow_future を True にしない限り、 未来の 日付のオブジェクトは表 示しません。
必須の引数:
- year: アーカイブを提供する年の 4 桁の年号 (の文字列) です。
- week: アーカイブを提供する週 (の文字列) です。週は日曜から始まり ます。
- queryset: アーカイブを提供するオブジェクトの QuerySet です。
- date_field: QuerySet に指定したモデルの DateField または DateTimeField 型のフィールド名です。日付ベースのアーカイブで、ペー ジに掲載するオブジェクトを決定するために使います。
オプションの引数:
- template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
- template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
- extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
- allow_empty: オブジェクトがない場合にページを表示するかどうかを示 すブール値です。 False の場合、表示するべきオブジェクトが存在しな ければ、空のインデクスページを表示する代わりに 404 エラーを送出します。 デフォルトは False です。
- context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
- template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。ビュー はこの変数名に '_list' を追加して変数名を決定します。
- mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
- allow_future: 「未来の」オブジェクトをページに表示するかどうかを 制御するブール値です。「未来の」オブジェクトとは、 date_field に 指定したフィールドの値が現在の日/時よりも大きいようなオブジェクトで す。デフォルトでは False です。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_archive_week.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
- week: 指定週を表す datetime.date オブジェクトです。
- object_list: 指定週内のオブジェクトからなるリストです。この変数の 名前は template_object_name パラメタの設定に依存します。 template_object_name のデフォルト値は 'object' で、例えば template_object_name の値が 'foo' であれば、変数名は foo_list になります。
django.views.generic.date_based.archive_day
解説:
指定日の全てのオブジェクトのリストを表示する、日ごとのアーカイブページです。 allow_future を True にしない限り、 未来の 日付のオブジェクトを表 示させようとすると、該当するオブジェクトの有無にかかわらず 404 エラーを送出 します。
必須の引数:
- year: アーカイブを提供する年の 4 桁の年号 (の文字列) です。
- month: アーカイブを提供する月です。 month_format 引数に従って フォーマットされています。
- day: アーカイブを提供する日です。 day_format 引数に従ってフォー マットされています。
- queryset: アーカイブを提供するオブジェクトの QuerySet です。
- date_field: QuerySet に指定したモデルの DateField または DateTimeField 型のフィールド名です。日付ベースのアーカイブで、ペー ジに掲載するオブジェクトを決定するために使います。
オプションの引数:
- month_format: month パラメタで使っているフォーマットを指定す るためのフォーマット文字列です。この値は Python の time.strftime が受け取るのと同じ書法のフォーマット文字列を指定します。 (strftime のドキュメント 参照)。デフォルトでは "%b" に設定さ れており、これは 3 文字で省略して表した月名です。数字を使うように変え たければ "%m" を使って下さい。
- day_format: month_format に似ていますが、 day パラメタ用 です。デフォルト値は "%d" (日付を 01-31 の 2 桁の 10 進数で表した もの) です。
- template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
- template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
- extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
- allow_empty: オブジェクトがない場合にページを表示するかどうかを示 すブール値です。 False の場合、表示するべきオブジェクトが存在しな ければ、空のインデクスページを表示する代わりに 404 エラーを送出します。 デフォルトは False です。
- context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
- template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。ビュー はこの変数名に '_list' を追加して変数名を決定します。
- mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
- allow_future: 「未来の」オブジェクトをページに表示するかどうかを 制御するブール値です。「未来の」オブジェクトとは、 date_field に 指定したフィールドの値が現在の日/時よりも大きいようなオブジェクトで す。デフォルトでは False です。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_archive_day.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
- day: 指定日を表す datetime.date オブジェクトです。
- next_day: 次の日を表す datetime.date オブジェクトです。次の 日が未来の日付の場合には None になります。
- previous_day: 前の日を表す datetime.date オブジェクトです。 next_day と違い、決して None にはなりません。
- object_list: 指定月内のオブジェクトからなるリストです。この変数の 名前は template_object_name パラメタの設定に依存します。 template_object_name のデフォルト値は 'object' で、例えば template_object_name の値が 'foo' であれば、変数名は foo_list になります。
django.views.generic.date_based.archive_today
解説:
今日 の全てのオブジェクトを表示する日ごとアーカイブページです。このページ は archive_day と全く同じで、 year/month/day といった引数を とらず、今日の日付を使う点だけが違います。
django.views.generic.date_based.object_detail
解説:
個々のオブジェクトを表現するページです。オブジェクトに設定された時刻が未来 を表す値の場合、 allow_future を True にしない限り、このビューはデフォ ルトで 404 エラーを送出します。
必須の引数:
year: オブジェクトの日付の年部分で、 4 桁の年号 (の文字列) です。
month: オブジェクトの日付の月部分で、 month_format 引数に従っ てフォーマットされています。
day: オブジェクトの日付の日部分で、 day_format 引数に従って フォーマットされています。
queryset: オブジェクトの入っている QuerySet です。
date_field: QuerySet に指定したモデルの DateField または DateTimeField 型のフィールド名です。汎用ビューが year, month, day に応じてオブジェクトを照合するために使います。
object_id または (slug と slug_field) が必要です。
object_id を使う場合、ページに表示するオブジェクトの主キーとなる フィールドの値を指定せねばなりません。
そうでない場合には、 slug にオブジェクトの slug を、 slug_field に QuerySet に指定したモデルの slug フィールド名を 指定せねばなりません。 slug_field のデフォルト値は 'slug' で す。
オプションの引数:
month_format: month パラメタで使っているフォーマットを指定す るためのフォーマット文字列です。この値は Python の time.strftime が受け取るのと同じ書法のフォーマット文字列を指定します。 (strftime のドキュメント 参照)。デフォルトでは "%b" に設定さ れており、これは 3 文字で省略して表した月名です。数字を使うように変え たければ "%m" を使って下さい。
day_format: month_format に似ていますが、 day パラメタ用 です。デフォルト値は "%d" (日付を 01-31 の 2 桁の 10 進数で表した もの) です。
template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
template_name_field: オブジェクトの表示に使うテンプレート名が入っ たフィールドの名前です。このパラメタを使うと、データ中にテンプレート 名を保存しておけます。 例えば、オブジェクトに 'the_template' という名前のフィールドがあ り、その値が 'foo.html' という文字列の場合、 template_name_field を 'the_template' に指定しておくと、汎用 ビューはオブジェクトの表示に 'foo.html' を使おうとするわけです。
ちょっと首を捻りたくなるような機能ですが、場合によってはとても便利な 機能です。
template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
allow_empty: オブジェクトがない場合にページを表示するかどうかを示 すブール値です。 False の場合、表示するべきオブジェクトが存在しな ければ、空のインデクスページを表示する代わりに 404 エラーを送出します。 デフォルトは False です。
context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。ビュー はこの変数名に '_list' を追加して変数名を決定します。
mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
allow_future: 「未来の」オブジェクトをページに表示するかどうかを 制御するブール値です。「未来の」オブジェクトとは、 date_field に 指定したフィールドの値が現在の日/時よりも大きいようなオブジェクトで す。デフォルトでは False です。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_detail.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
- object: オブジェクトです。この変数変の名前は template_object_name パラメタの値に依存し、そのデフォルト値は 'object' です。 template_object_name が 'foo' の場合、変 数名は foo になります。
リスト/詳細形式の汎用ビュー
リスト-詳細 (list/detail) 形式の汎用ビューフレームワーク (django.views.generic.list_detail モジュール) は、日付ベースの汎用ビュー に似ていますが、オブジェクトのリストと個々のオブジェクトのページという二つ のビューしか持ちません。
django.views.generic.list_detail.object_list
解説:
オブジェクトのリストを表現するページです。
必須の引数:
- queryset: オブジェクトの入っている QuerySet です。
オプションの引数:
- paginate_by: ページあたり何個のオブジェクトを表示するかを指定する 整数です。この引数を指定すると、ビューはオブジェクトをページあたり paginate_by 個のオブジェクトに分割します。ビューは (GET を介 して渡される) クエリ文字列パラメタか、 URLconf で指定した変数 page を引数にとります。詳しくは下記の 「 pagination に関する注意 」を参照してください。
- page: 現在のページ番号を指定する 1 から始まる整数値です。 詳しくは下記の「 pagination に関する注意 」を参照してください。
- template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
- template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
- extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
- allow_empty: オブジェクトがない場合にページを表示するかどうかを示 すブール値です。 False の場合、表示するべきオブジェクトが存在しな ければ、空のインデクスページを表示する代わりに 404 エラーを送出します。 デフォルトは True です。
- context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
- template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。ビュー はこの変数名に '_list' を追加して変数名を決定します。
- mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_list.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
- object_list: オブジェクトのリストです。この変数の名前は template_object_name パラメタの設定に依存します。 template_object_name のデフォルト値は 'object' で、例えば template_object_name の値が 'foo' であれば、変数名は foo_list になります。
- is_paginated: 表示結果がページ分割されているかどうかを示すブール 値です。具体的には、オブジェクトの個数が paginate_by と等しいかそ れ以下の場合には False にセットされます。
表示結果がページ分割されている場合、コンテキストには以下の追加の変数が入り ます:
- results_per_page: ページあたりのオブジェクト数です (paginate_by パラメタと同じです)。
- has_next: 次のページがあるかどうかを示すブール値です。
- has_previous: 前のページがあるかどうかを示すブール値です。
- page: 現在のページ番号を表す整数です。 1 から始まる値です。
- next: 次のページ番号を表す整数です。次のページがなくても、理 屈上の次のページ番号を表す値になります。 1 から始まる値です。
- previous: 前のページ番号を表す整数です。 1 から始まる値です。
- last_on_page: 現在のページの末尾のオブジェクトのインデクスです。 1 から始まる値です。
- first_on_page: 現在のページの先頭のオブジェクトのインデクスです。 1 から始まる値です。
- pages: 総ページ数を表す整数です。
- hits: 現在のページだけでなく、 全ての ページにわたるオブジェク トの総数です。
- 開発版の Django で登場した機能: page_range: 実在するページ番 号からなるリストです。ページ番号は 1 から開始します。
pagination に関する注意
paginate_by を指定した場合、 Django は結果をページ分割 (peginate) しま す。 URL でページ番号を指定するには二つの方法があります:
URLconf で page パラメタをキャプチャします。例えば、 URLconf は以 下のようになるでしょう:
(r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict))ページ番号をクエリ文字列パラメタ page に渡します。例えば URL は以 下のようになります:
/objects/?page=3全てのページ番号にわたるループを実施したい場合は、 page_range を 使ってください。例えば、``page_range`` にわたる反復処理を行って、 全てのページへのリンクを作成できます。
page や page_range は 0 ではなく 1 から始まる数で指定します。従って 最初のページのページ番号は 1 です。
ペジネーションの用例は、 object pagination のモデルサンプルにあります。
開発版の Django で登場した機能:
特別なケースとして、 page の値に last を使えます:
/objects/?page=last
このようにすると、いちいち総ページ数を数えなくても、最後のページにアクセス できます。
page の値は実在するページ番号か、 last でなければなりません。それ以 外の値を page に指定すると 404 エラーを引き起こします。
django.views.generic.list_detail.object_detail
個々のオブジェクトを表現するページです。
解説:
個々のオブジェクトを表現するページです。
必須の引数:
queryset: オブジェクトの入っている QuerySet です。
object_id または (slug と slug_field) が必要です。
object_id を使う場合、ページに表示するオブジェクトの主キーとなる フィールドの値を指定せねばなりません。
そうでない場合には、 slug にオブジェクトの slug を、 slug_field に QuerySet に指定したモデルの slug フィールド名を 指定せねばなりません。 slug_field のデフォルト値は 'slug' で す。
オプションの引数:
template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
template_name_field: オブジェクトの表示に使うテンプレート名が入っ たフィールドの名前です。このパラメタを使うと、データ中にテンプレート 名を保存しておけます。 別の言い方をするなら、オブジェクトに 'the_template' という名前の フィールドがあり、その値が 'foo.html' という文字列の場合、 template_name_field を 'the_template' に指定しておくと、汎用 ビューはオブジェクトの表示に 'foo.html' を使おうとします。
ちょっと首を捻りたくなるような機能ですが、場合によってはとても便利な 機能です。
template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。ビュー はこの変数名に '_list' を追加して変数名を決定します。
mimetype: 出力結果のドキュメントに適用する MIME タイプです。 デフォルトの値は DEFAULT_CONTENT_TYPE の設定値になります。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_detail.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
- object: オブジェクトです。この変数変の名前は template_object_name パラメタの値に依存し、そのデフォルト値は 'object' です。 template_object_name が 'foo' の場合、変 数名は foo になります。
作成/更新/削除の汎用ビュー
django.views.generic.create_update モジュールには、オブジェクトの作成 (create)、編集 (edit, update)、削除 (delete) のための関数が入っています。
django.views.generic.create_update.create_object
解説:
オブジェクト作成のためのフォームを表示し、オブジェクトを保存するためのペー ジです。検証エラーが生じた場合にはフォームを再表示します。このビューは、 Django モデルに付属の自動マニピュレータを使います。
必須の引数:
- model: フォームを使って作成するオブジェクトの Django モデルクラス です。
オプションの引数:
post_save_redirect: はオブジェクトを保存した後のビューのリダイレ クト先 の URL です。デフォルト値は object.get_absolute_url() です。
post_save_redirect には、辞書を使う文字列フォーマット引数を含めら れます。辞書のキーはオブジェクトのフィールド名に解釈されます。例えば、 post_save_redirect="/polls/%(slug)s/" のように指定できます。
login_required: オブジェクトを編集し、変更を保存するため編集にロ グインが必要かどうかを指定するブール値です。 Django の 認証システム にフックをかけます。デフォルト値は False です。
この値が True の場合、匿名ユーザがこのページを訪問したりフォーム を保存しようとしたりすると、 Django はリクエストを /accounts/login/ にリダイレクトします。
template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_form.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
form: オブジェクトを編集するためのフォームを表現する django.oldforms.FormWrapper インスタンスです。 FormWrapper イン スタンスを使うと、テンプレートシステム中でフォームフィールドを簡単に 参照できます。
例えば、 model が name と address という二つのフィールド を持っている場合は以下のようになります:
<form action="" method="post"> <p><label for="id_name">Name:</label> {{ form.name }}</p> <p><label for="id_address">Address:</label> {{ form.address }}</p> </form>FormWrapper オブジェクトをテンプレート内で使うための詳しい情報は、 マニピュレータとフォームフィールドのドキュメント を参照してください。
django.views.generic.create_update.update_object
解説:
既存のオブジェクトを編集するためのフォームを表示し、オブジェクトを保存する ためのページです。検証エラーが生じた場合にはフォームを再表示します。このビュー は、 Django モデルに付属の自動マニピュレータを使います。
必須の引数:
model: フォームを使って作成するオブジェクトの Django モデルクラス です。
object_id または (slug と slug_field) が必要です。
object_id を使う場合、ページに表示するオブジェクトの主キーとなる フィールドの値を指定せねばなりません。
そうでない場合には、 slug にオブジェクトの slug を、 slug_field に QuerySet に指定したモデルの slug フィールド名を 指定せねばなりません。 slug_field のデフォルト値は 'slug' で す。
オプションの引数:
post_save_redirect: オブジェクトを保存した後のビューのリダイレ クト先 の URL です。デフォルト値は object.get_absolute_url() です。
post_save_redirect には辞書を使う文字列フォーマット引数が入ります。 辞書のキーはオブジェクトのフィールド名に解釈されます。例えば、 post_save_redirect="/polls/%(slug)s/" のように指定できます。
login_required: オブジェクトを編集し、変更を保存するため編集にロ グインが必要かどうかを指定するブール値です。 Django の 認証システム にフックをかけます。デフォルト値は False です。
この値が True の場合、匿名ユーザがこのページを訪問したりフォーム を保存しようとしたりすると、 Django はリクエストを /accounts/login/ にリダイレクトします。
template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_form.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
form: オブジェクトを編集するためのフォームを表現する django.oldforms.FormWrapper インスタンスです。 FormWrapper イン スタンスを使うと、テンプレートシステム中でフォームフィールドを簡単に 参照できます。
例えば、 model が name と address という二つのフィールド を持っている場合は以下のようになります:
<form action="" method="post"> <p><label for="id_name">Name:</label> {{ form.name }}</p> <p><label for="id_address">Address:</label> {{ form.address }}</p> </form>FormWrapper オブジェクトをテンプレート内で使うための詳しい情報は、 マニピュレータとフォームフィールドのドキュメント を参照してください。
object: オブジェクトです。この変数変の名前は template_object_name パラメタの値に依存し、そのデフォルト値は 'object' です。 template_object_name が 'foo' の場合、変 数名は foo になります。
django.views.generic.create_update.delete_object
解説:
既存のオブジェクトを削除するための確認ページを表示し、オブジェクトを削除する ためのページです。オブジェクトを削除するのはリクエストメソッドが POST であった場合だけです。このビューを GET で取得すると、同じ URL に対して POST を行うような確認ページを表示します。
必須の引数:
model: フォームで削除するオブジェクトの Django モデルクラス です。
object_id または (slug と slug_field) が必要です。
object_id を使う場合、ページに表示するオブジェクトの主キーとなる フィールドの値を指定せねばなりません。
そうでない場合には、 slug にオブジェクトの slug を、 slug_field に QuerySet に指定したモデルの slug フィールド名を 指定せねばなりません。 slug_field のデフォルト値は 'slug' で す。
post_delete_redirect: オブジェクトを削除した後のビューのリダイレ クト先 の URL です。
オプションの引数:
login_required: ページを表示し、変更を保存するため編集にログイン が必要かどうかを指定するブール値です。 Django の 認証システム にフッ クをかけます。デフォルト値は False です。
この値が True の場合、匿名ユーザがこのページを訪問したりフォーム を保存しようとしたりすると、 Django はリクエストを /accounts/login/ にリダイレクトします。
template_name: ページのレンダリングに使うテンプレートの完全な名前 です。この変数を使うと、デフォルトのテンプレート名 (下記参照) をオー バライドできます。
template_loader: テンプレートのロードに使うテンプレートローダです。 デフォルトでは django.template.loader になっています。
extra_context: テンプレートコンテキストに追加する値からなる辞書で す。デフォルトでは、この辞書は空になっています。辞書内の値が呼び出し 可能オブジェクトの場合、汎用ビューはテンプレートのレンダリング直前に そのオブジェクトを呼び出します。
context_processors: ビューのテンプレートに適用するテンプレートコ ンテキストプロセッサのリストです。 RequestContext のドキュメント を参照してください。
template_object_name: テンプレートコンテキスト内で使うテンプレー ト変数名を示します。デフォルトでは 'object' になっています。
テンプレート名:
template_name を指定しない場合、ビューはデフォルトのテンプレートである <app_label>/<model_name>_confirm_delete.html を使います。
テンプレートコンテキスト:
extra_context の値に加え、テンプレートのコンテキストには以下の変数が入 ります:
- object: オブジェクトです。この変数変の名前は template_object_name パラメタの値に依存し、そのデフォルト値は 'object' です。 template_object_name が 'foo' の場合、変 数名は foo になります。