2016-02-22 2 views
5

У меня есть приложение Django, которое использует систему шаблонов Django для создания своего (не HTML) вывода, кроме того, веб-интерфейс. Существует ряд страниц, на которых пользователь может создать шаблон для отчета, добавив {{}} теги для замены переменных и дополнительную библиотеку templatetag, чтобы отформатировать все.django шаблон двигателя с проверкой ошибок?

Однако нынешний способ я делаю это просто:

t = Template(component_template) 
self.output_content = t.render(component_context) 

который использует веб-выходной двигатель шаблона по умолчанию. У этого есть string_if_invalid, установленный на None, и ужасные предупреждения в руководстве о том, чтобы сломать страницы администратора, если вы его измените.

Так что, если пользователь получает либо опечатку в имени переменной в теге, она тихо игнорируется и выводит ее на выход. Если у них есть искаженный тег, он фактически убивает веб-приложение. Я ищу способ проверки шаблона во время редактирования, так что пользователь может быть предупрежден о необходимости внесения изменений.

Что я стремлюсь к что-то вроде вывода компилятора:

unknown variable 'ffsdfd' on line 33 of template 
template syntax error on line 22 of template 

Моя первая мысль была, чтобы создать новый шаблон Engine() и использовать его для этой одной цели, так что я мог заметить отличительную по умолчанию string_if_invalid, но это ничего мне не говорит о недостающей/неправильной переменной.

engine = Engine(string_if_invalid="!!MISSING_VARIABLE!!", dirs=settings.TEMPLATES[0]['DIRS'], 
       context_processors=settings.TEMPLATES[0]['OPTIONS']['context_processors'], 
       app_dirs=settings.TEMPLATES[0]['APP_DIRS']) 

t = Template(component_template, engine=engine) 

try: 
    self.output_content = t.render(component_context) 
except TemplateSyntaxError: 
    pass # do something useful here to collect error messages 

Исключение TemplateSyntaxError работает, за исключением того, я не получаю никакой информации контекста, например, где ошибка на самом деле, и, конечно, я получаю только первый провал. Глядя в код django.template, он выглядит как внутреннее, есть какое-то расширенное исключение, которое имеет номер строки и токен, которые заставляли его задыхаться, но это не ускользнет от метода render().

Итак:

Как я могу получить полезную обработку ошибок для ошибок в отредактированные пользователем шаблонов? Должен ли я делать это совсем по-другому?

ответ

4

Вот как я решаю это самостоятельно, используя пользовательский класс и string_if_invalid. Это дает вам имя переменной, но я уверен, что вы можете настроить ее дальше, чтобы получить дополнительную информацию о контекстах.

Global settings.py пример, должен быть легко адаптируемым к вашему инлайн например:

class InvalidTemplateVariable(str): 
    def __mod__(self,other): 
     from django.template.base import TemplateSyntaxError 
     raise TemplateSyntaxError("Invalid variable : '%s'" % other) 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [....], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'string_if_invalid': InvalidTemplateVariable("%s"), 
      'context_processors': [ 
       .... 
      ], 
     }, 
    }, 
] 

BTW, вы можете получить дополнительную информацию о том, как/почему это работает в следующей статье (которую я написал) http://www.webforefront.com/django/customizedjangotemplates.html#stringifinvaliderror

+0

Aha! Поэтому на самом деле часть, которую я отсутствовала, была: «Если string_if_invalid содержит«% s », маркер формата будет заменен именем недопустимой переменной». (https://docs.djangoproject.com/en/1.9/ref/templates/api/#invalid-template-variables) (Но переход от str к исключению хороший!) – AnotherHowie

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