Djangoでアプリを作成するときサイト全体で使用できる定数(変数)があると便利なことが多いかと思います。
たとえば、アプリ名やバージョンなどサイト全体で表示させるテキストです。
Djangoでは、コンテキストプロセッサー(Context Processor)を使用して、定義した定数を取り出します。もちろん、複数設定可能です。
環境
ソフト | バージョン |
---|---|
Nginx | 1.16.1 |
uWSGI | 2.0.18 |
Python | 3.8.2 |
Django | 3.0.5 |
Django 3.0.x でのやり方になります。
Templateで扱う変数は、通常viewを通じて渡すが…
Templateでは、{{ 変数 }}
というようにして変数を取得して表示しますが、これは通常viewを通じて渡されます。このやり方だとアプリ毎に変数を渡す処理を記述する必要があり、非効率的です。
通常の参照方法
def viewFunc(request):
template_name = "template.html"
context = {"variable" : "hello world!"}
return render(request,template_name,context)
アプリのviewにview関数を作成し、contextとして値を渡します。
<p>{{ 変数名 }}</p>
このような形でテンプレート内で表示します。
アプリ全体で使用できる定数の設定
コンテキストプロセッサー(Context Processor)を作成することで、アプリ全体への値/オブジェクト渡しが可能になります。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
…
'mlapp.context_processors.constant_text',, #これを追加
],
},
},
]
これから追加するconstant_textという関数がテンプレートの値を取得するものになります。
def constant_text(request):
return {
'APP_NAME': 'TEST APP',
}
return
のところにAPP_NAME
というのを追加しています。context_processors.py
は,settings.py
と同じディレクトリ内に作成します。
<p>{{ APP_NAME }}</p>
これで、アプリ全体から変数を取得し、テンプレートで表示することが可能になります。たったこれだけなので、簡単です。
settings.pyに値を設定したい場合
APP_DESCRIPTION='This is a test app.'
settings.py
に変数を作り、値を代入します。
from django.conf import settings
def constant_text(request):
return {
'APP_NAME': 'TEST APP',
'APP_DESCRIPTION': settings.APP_DESCRIPTION,
}
settings.py
から値を読み込みます。
<h1>{{ APP_NAME }}</h2>
<p>{{ APP_DESCRIPTION }}</p>
このようにすることで、settings.py
の値も扱えるようになります。
とっても簡単ですね。