Как я могу сказать шаблонам Django не анализировать блок, содержащий код, который выглядит как теги шаблона? - PullRequest
14 голосов
/ 17 ноября 2011

У меня есть несколько html-файлов, которые содержат шаблоны, которые будут использоваться jQuery.tmpl . Некоторые теги tmpl (например, {{if...}}) выглядят как теги шаблонов Django и вызывают TemplateSyntaxError. Есть ли способ указать, что система шаблонов Django должна игнорировать несколько строк и выводить их в точности так, как они есть?

Ответы [ 2 ]

21 голосов
/ 17 ноября 2011

Начиная с Django 1.5, это теперь обрабатывается встроенным тегом шаблона verbatim.

В старых версиях Django встроенным способом было бы вручную экранировать каждый элемент шаблона с помощью тега шаблона templatetag (https://docs.djangoproject.com/en/1.3/ref/templates/builtins/#templatetag), но я подозреваю, что это не то, что вы хотите сделать.

Что вам действительно нужно, так это способ пометить весь блок как необработанный (а не интерпретируемый) текст, для которого требуется новый пользовательский тег. Возможно, вы захотите проверить тег raw здесь: http://www.holovaty.com/writing/django-two-phased-rendering/

5 голосов
/ 17 ноября 2011

Существует два открытых билета для решения этой проблемы: https://code.djangoproject.com/ticket/14502 и https://code.djangoproject.com/ticket/16318 Вы можете найти предложенный новый шаблон тега verbatim ниже:

"""
From https://gist.github.com/1313862
"""

from django import template

register = template.Library()


class VerbatimNode(template.Node):

    def __init__(self, text):
        self.text = text

    def render(self, context):
        return self.text


@register.tag
def verbatim(parser, token):
    text = []
    while 1:
        token = parser.tokens.pop(0)
        if token.contents == 'endverbatim':
            break
        if token.token_type == template.TOKEN_VAR:
            text.append('{{')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('{%')
        text.append(token.contents)
        if token.token_type == template.TOKEN_VAR:
            text.append('}}')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('%}')
    return VerbatimNode(''.join(text))
...