2012-01-24 4 views
8

В шаблоне django вызов {{ var }} будет бесшумно завершен, если var не определено. Это затрудняет отладку шаблонов. Есть ли настройка, которую я могу переключить, так что django будет генерировать исключение в этом случае?Сделать шаблоны django строгими

Единственный намек на решение, которое я нашел в Интернете, - http://groups.google.com/group/google-appengine/browse_thread/thread/86a5b12ff868038d, и это звучит ужасно взломанно.

+0

Способ 1 в указанной вами ссылке выглядит хорошо. Так как пользовательские теги шаблонов являются законным вариантом расширения функциональности шаблона. –

ответ

4

Джанго < = 1,9

Set TEMPLATE_STRING_IF_INVALID = 'DEBUG WARNING: undefined template variable [%s] not found' в вашем settings.py.

Смотрите документы:
https://docs.djangoproject.com/en/1.9/ref/settings/#template-string-if-invalid

Django> = 1,10

Установите параметр string_if_invalid = 'DEBUG WARNING: undefined template variable [%s] not found' шаблон в вашем settings.py.

Смотрите документацию: https://docs.djangoproject.com/en/2.0/topics/templates/#module-django.template.backends.django

Также читайте: http://docs.djangoproject.com/en/dev/ref/templates/api/#invalid-template-variables

+1

'TEMPLATE_STRING_IF_INVALID = '% s'' было бы более уместным, так как это напечатает имя переменной, которое не определено, а не какой-либо случайный текст. Однако внимательно прочитайте поле предупреждения на второй ссылке. Это действительно для одноразовых отладочных экземпляров, * не * то, что вы должны просто оставить в процессе разработки. –

+2

Настройки TEMPLATE_STRING_IF_INVALID помогут найти недопустимые переменные при попытке распечатать их в шаблоне, но если переменная используется в if-statement или как коллекция в цикле for, то помощи не найти. .. Есть ли способ поймать эти случаи? – Eldamir

+1

Есть ли способ повысить исключение, если переменная не определена? – utapyngo

-1

Это часть конструкции. Он позволяет вам предоставлять настройки по умолчанию и переключаться в зависимости от того, существует ли переменная в контексте. Он также позволяет шаблонам быть очень гибкими и способствует повторному использованию шаблонов вместо строгого подхода «каждый взгляд должен иметь свой собственный шаблон».

Подробнее, шаблоны на самом деле не должны «отлаживаться». Идея состоит в том, чтобы поместить как можно больше вашей логики за пределами шаблон, на виды или модели. Если вы хотите выяснить, почему переменная, которая должна быть передана в контекст, отсутствует, место для отладки, которое находится в вашем представлении. Просто опустите import pdb;pdb.set_trace() где-то перед тем, как ваш взгляд вернется и начнется.

+1

Это код; в какой-то момент потребуется отладка. – Marcin

+0

@ Марцин: Я говорю в смысле перспективы Джанго. Если вы полагаетесь на ошибки отладки шаблонов в разработке для вещей, не связанных с переполнением шаблонов templatetag или другими простыми ошибками, у вас, вероятно, слишком много логики в вашем шаблоне. –

+0

Ну, это вопрос мнения :) Но это «Django Opinion», и если вам достаточно вопросов, используйте другой механизм шаблонов! Я по этой причине среди других. – AdamKG

2

Этот хак от djangosnippets вызовет исключение, когда неопределенная переменная встречается в шаблоне.

# settings.py 
class InvalidVarException(object): 
    def __mod__(self, missing): 
     try: 
      missing_str = unicode(missing) 
     except: 
      missing_str = 'Failed to create string representation' 
     raise Exception('Unknown template variable %r %s' % (missing, missing_str)) 
    def __contains__(self, search): 
     if search == '%s': 
      return True 
     return False 

TEMPLATE_DEBUG = True 
TEMPLATE_STRING_IF_INVALID = InvalidVarException() 
+0

Это не похоже на обнаружение неопределенного foobar в '{% if foobar%}' или '{% for foo in foobar%}' – azmeuk

+0

После обновления с 1.9.x> 1.10.1 я получаю: '?: (шаблоны. E002) 'string_if_invalid' в TEMPLATES OPTIONS должен быть строкой, но получил: (InvalidVarException). Таким образом, этот хак больше не работает. – allcaps

+0

@allcaps Что делать, если вы наследуете его от 'basestring' или' unicode'? – utapyngo

Смежные вопросы