はじめに
Djangoのテンプレート内でドメイン名やサイト名などの基本的に固定となる定数値を扱いたいとき、Context Processorという機能を利用して、都度ビュー側から定数を渡さずにテンプレート内から定数のように扱うことができます。
環境
- Django 2.2
Context Processor とは
Context Processorはビューからテンプレートへコンテキストオブジェクトを渡す際に変数を追加する処理を記述できる関数です。
テンプレート内で利用するcsrf_token
等がこの仕組みで実装されています。
Context Processor の作成
Context ProcessorはHTTP Request
オブジェクトを引数として、辞書型のオブジェクトを返す関数として定義します。
関数の名前は任意の名前で作成し、ファイルはアプリケーションのディレクトリ配下等に作成します。
def my_context_processor(req):
return {
'domain_name': 'https://hogehoge.com',
'site_name': 'Hogehoge Site',
}
上記の例では単純に辞書オブジェクトを返却しているのみですが、通常の関数同様に処理を記述することもできます。これを利用して外部ファイルに別で定義した定数を参照したり、環境変数の値から環境によって値を変える等の使い方も可能です。
config.py設定
作成したContext Processorを利用するには、config.py
への設定が必要になります。
config.py
で定義されているTEMPLATESのOPTIONSにあるcontext_processors
へ前項で作成した関数を追加します。
TEMPLATES = [
{
'OPTIONS': {
'context_processors': [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'hogeapp.context_processors.my_context_processor', # 追加
],
},
},
]
テンプレートからの呼び出し方法
Context Processorで追加される変数は、テンプレート内から通常のコンテキストの変数と同じように利用できます。
<link rel="icon" href="{{ domain_name }}/favicon.ico">
<title>{{ site_name }}</title>
参考
The Django template language: for Python programmers | Django ドキュメント | Django
https://docs.djangoproject.com/ja/2.2/ref/templates/api/#writing-your-own-context-processors