TEMPLATE_STRING_IF_INVALID
не работает для меня.Быстрое решение - открыть env/lib64/python2.7/site-packages/django/template/base.py
, найти except Exception
и добавить туда print e
(при условии, что вы используете manage.py runserver
и можете видеть вывод на печать).
Однако на несколько строк внизэто current = context.template.engine.string_if_invalid
.Я заметил, что string_if_invalid
был пуст, несмотря на то, что установил TEMPLATE_STRING_IF_INVALID
.Это привело меня к этой части документов:
https://docs.djangoproject.com/en/1.8/ref/templates/upgrading/#the-templates-settings
Система шаблонов Django была пересмотрена в Django 1.8, когда она получила поддержку нескольких шаблонизаторов.
...
Если ваш модуль настроек определяет ALLOWED_INCLUDE_ROOTS
или TEMPLATE_STRING_IF_INVALID
, включите их значения в клавиши allowed_include_roots
и string_if_invalid
в словаре OPTIONS
.
Таким образом, в дополнение к @ slacy's TemplateSyntaxError трюк,
class InvalidString(str):
def __mod__(self, other):
from django.template.base import TemplateSyntaxError
raise TemplateSyntaxError(
"Undefined variable or unknown value for: %s" % other)
TEMPLATE_STRING_IF_INVALID = InvalidString("%s")
вам также необходимо определить string_if_invalid
следующим образом
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'string_if_invalid': TEMPLATE_STRING_IF_INVALID,
...
Сразу же обнаружилось множество проблем, о которых я даже не знал.Это действительно должно быть включено по умолчанию.Чтобы решить теги и фильтры, которые ожидают сбоев в автоматическом режиме, я добавил вокруг них условные выражения:
{% if obj.might_not_exist %}
{{ obj.might_not_exist }}
{% endif %}
Хотя я подозреваю, что это работает только потому, что {% if %}
завершается сбоем в автоматическом режиме.Другим подходом может быть создание фильтра hasattr
: {% if obj|hasattr:"might_not_exist" %}
.