ショートカットの使用
ここでさらに一歩進めて「DBを検索してデータがなかったらHTTPレスポンスコード404を返す」という記述は定型的であり、誰が書いても大体同じ記述になるので共通化したいところです。Djangoではそのような定型的な記述を簡潔に記述できるようにするための「ショートカット(Shortcuts)」というライブラリを用意しています。ここでは「get_object_or_404」というショートカットを使用して、404エラーを返せるようにします。リスト8にショートカットを使用したソースを示します。
from django.shortcuts import get_object_or_404
def item_page_display(request,item_id):
item = get_object_or_404(Item,id=item_id) #ショートカットを使用(データが存在しない場合404エラーが返る)
t = loader.get_template('page/item.html')
c = Context(
{'item':item }
)
return HttpResponse(t.render(c))
ブラウザをリロードすると、図8と同じ404エラーが表示されます。
汎用ビュー(Generic Views)
ここでitem_page_displayビュー関数のコードをさらに短くしてみましょう。コードの後半部分で「Templateインスタンスを取得後、 Contextのインスタンスを生成し、TempateのrenderメソッドでレンダリングしたHTML文字列をHttpResponseのコンストラクタに渡して返す」という処理が記述されていますが、これもビューに関する決まりきった処理であると言えます。このようにビューの処理に関する定型的な処理を何度も書かなくて済むように汎用化した機能が、Djangoでは「汎用ビュー(Generic Views)」として用意されています。
direct_to_template汎用ビューの適用
ここではdirect_to_template汎用ビューを使用します。direct_to_template汎用ビューは引数にrequestオブジェクトと、リダイレクト先テンプレート名、そしてテンプレートにマージしたい値を格納した辞書(dictionary)を引数に指定します。 direct_to_template汎用ビューをitem_page_displayビュー関数で使用したのがリスト9です。なお汎用ビューでは共通の省略可能な引数を用意していて、デフォルト値から変更したい場合は必要に応じて引数を指定します。今回はその共通引数は指定しません。
def item_page_display(request,item_id):
item = get_object_or_404(Item,id=item_id)
return direct_to_template(
request,'page/item.html',
extra_context={'item': item}
)
