Djangoのテンプレートでデバッグモードを判定する
目次
はじめに
Djangoのテンプレートすべてのページから、{% if DEBUG %}を用いてデバッグモードを判定できるようにする方法を紹介します。context_processorsを用いることで行います。
ビューでデバッグモードを判定する方法
Djangoのビューでデバッグモードを判定する方法として下記があります。
from django.conf import settings
DEBUG = settings.DEBUG
print(DEBUG) # True
いちいちこの変数をテンプレートに渡すのは面倒なので、context_processorsを用いてDEBUG変数を定義してみます。
django.template.context_processors.debugは微妙
似たような機能として、標準でもdjango.template.context_processors.debugが存在します。
The Django template language: for Python programmers | Django ドキュメント | Django
https://docs.djangoproject.com/ja/2.2/ref/templates/api/#django.template.context_processors.debug
しかし、この機能はINTERNAL_IPSを適切に設定していないと機能しません。
設定 | Django ドキュメント | Django
https://docs.djangoproject.com/ja/2.2/ref/settings/#internal-ips
Dockerなどを用いると、ローカル開発環境でさえも様々なIPからアクセスされるのでなかなか使いにくいです。
context_processorsを用いたDEBUG変数定義
そこで、INTERNAL_IPSを気にせずsettings.pyのDEBUGを問答無用でテンプレートから呼び出せるcontext_processorsを作ってみます。
app/context_processors.pyに下記のプログラムを追加します。
from django.conf import settings
def is_debug(request):
return {"DEBUG": settings.DEBUG}
そして、setting.pyのTEMPLATES['OPTIONS']['context_processors']に今回追加したcontext_processorsを追加します。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug', # ←消して良い
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'app.context_processors.is_debug', # 追加
],
},
},
]
以上で、{% if DEBUG %}が利用できます。