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

しかし、この機能はINTERNAL_IPSを適切に設定していないと機能しません。

設定 | Django ドキュメント | Django

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 %}が利用できます。

コメント