Одним из решений было бы изменить бэкэнд вашего шаблона на jinja2
(который поддерживается "изначально" Django) , следуя документации .
Подробное объяснение как jinja2
django обрабатывает проблему переменной undefined
, можно найти здесь (обозначение) :
Invalid переменные шаблона
Вы можете установить различные варианты поведения, когда в шаблонах Jinja встречается недопустимая переменная. Django устанавливает для Jinja два поведения по умолчанию: одно для случая, когда DEBUG=True
- общий параметр в разработке, а другое для случая, когда DEBUG=False
- общий параметр в рабочем состоянии.
Если DEBUG=True
и недопустимая переменная установлена в шаблоне Jinja, Jinja использует класс jinja2.DebugUndefined
для его обработки. Класс jinja2.DebugUndefined
дословно выводит переменную для рендеринга (например, если шаблон имеет оператор {{foo}}
, а переменная не существует в контексте, Jinja выводит {{foo}}
, что упрощает поиск недопустимой переменной).
Если DEBUG=False
и недопустимая переменная установлена в шаблоне Jinja, Jinja использует класс jinja2.Undefined
для его обработки. Класс jinja2.Undefined
выводит пробел в позиции переменной для рендеринга (например, если шаблон имеет оператор {{bar}}
, а переменная не существует в контексте, Jinja выводит пробел). Стоит упомянуть, что это последнее поведение соответствует поведению по умолчанию недопустимых переменных в шаблонах Django.
В дополнение к классам jinja2.DebugUndefined
и jinja2.Undefined
Jinja также поддерживает jinja2.StrictUndefined
класс. Класс jinja2.StrictUndefined
используется для генерирования немедленной ошибки вместо продолжения рендеринга, что полезно для более быстрой диагностики недопустимых переменных. Однако имейте в виду, что последний класс меняет свое поведение на основе переменной DEBUG
, он либо генерирует ошибку стека с недопустимым именем переменной (т. Е. Когда DEBUG=True
), либо генерирует стандартную страницу ошибки HTTP 500 (т. Е. когда DEBUG=False
).
Если вы хотите установить опцию StrictUndefined
в своем шаблоне, вы можете использовать следующий пример из того же источника :
Листинг 4-4. Сгенерируйте ошибку для недопустимых переменных в Jinja с помощью jinja2.StrictUndefined
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_DIR = os.path.dirname(os.path.abspath(__file__))
import jinja2
TEMPLATES = [
{
'BACKEND':'django.template.backends.jinja2.Jinja2',
'DIRS': ['%s/jinjatemplates/'% (PROJECT_DIR),],
'APP_DIRS': True,
'OPTIONS': {
'undefined':jinja2.StrictUndefined
},
}
]
. Как видно из листинга 4-4, мы сначала объявляем import jinja2
, чтобы получить доступ к классам Jinja в settings.py
. Затем мы объявляем неопределенный ключ внутри параметра OPTIONS
и назначаем ему класс Jinja для обработки недопустимых переменных. В этом случае мы используем класс jinja2.StrictUndefined
для получения ошибок, когда встречаются недопустимые переменные шаблонов, но вы также можете использовать любой из двух других классов Jinja для обработки недопустимых переменных (т. Е. jinja2.DebugUndefined
или jinja2.Undefined
).
Наконец, если вы хотите иметь другое поведение между DEBUG=True
или DEBUG=False
, вы можете изменить следующее в настройках TEMPLATES
:
'OPTIONS': {
'undefined': jinja2.DebugUndefined if DEBUG else jinja2.StrictUndefined
},
Использование опции отладки jinja2 на разработку и строгие варианты производства (ошибки, как указано в вопросе).