Views.pyファイルのすべてのメソッドで同じコードを繰り返すことなく、すべてのテンプレートに変数を渡す方法を知りたいですか?
以下の例では、Webアプリのすべてのテンプレートでカテゴリ(カテゴリオブジェクトの配列)を利用できるようにしたいと思います。
Eg: I would like to avoid writing 'categories':categories on every method. Is it possible?
1つのビューメソッド
def front_page(request):
categories = Category.objects.all()
if is_logged_in(request) is False:
return render_to_response('users/signup.html', {'is_logged_in': is_logged_in(request), 'categories':categories}, context_instance=RequestContext(request))
else:
return render_to_response('users/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
別のビュー方法
def another_view_method(request):
categories = Category.objects.all()
return render_to_response('eg/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))
必要なのはコンテキストプロセッサであり、作成は非常に簡単です。 custom_app
というアプリがあるとすると、次の手順に従います。
custom_app
をINSTALLED_APPS
のsettings.py
に追加します(既に完了していますか?)。context_processors.py
フォルダーをcustom_app
フォルダーに作成します。その新しいファイルに次のコードを追加します。
def categories_processor(request):
categories = Category.objects.all()
return {'categories': categories}
context_processors.py
をTEMPLATE_CONTEXT_PROCESSORS
のsettings.py
に追加します
TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
そして今、あなたはすべてのテンプレートで{{categories}}
を使うことができます:D
Django 1.8現在
TEMPLATE_CONTEXT_PROCESSORS
を追加するには、設定で次のコードを追加する必要があります。
TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")
または、TEMPLATES
設定のOPTIONS.context_processors
キーに直接その文字列を含めます。