Подтвердить что ты не робот

Легкий способ избежать шаблонов шаблонов Django

Для нового проекта мы пишем документацию о системе шаблонов Django. Мы также используем Django для самого проекта документации, поэтому Django отображает все наши примерные переменные в примере кода и пытается их отобразить. Единственный способ найти это - использовать {% templatetag%}, но это делает наш код действительно нечитаемым. Возможно ли, чтобы Django игнорировал все переменные шаблона в определенном разделе?

4b9b3361

Ответ 1

Из-за ограничений в Djxo-шаблоне lexer (например, как kludgy hack) это невозможно. Однако, если вы хотите поместить свой пример кода в отдельные файлы, вы можете использовать тег ssi:

{% ssi /path/to/my/code/examples/example01.html %}

И он не будет анализировать файл, просто включите его дословно. Тем не менее, это также имеет ограничения в том, что вы не можете использовать переменные в пути include (т.е. Если вы перемещаете расположение шаблонов, вам необходимо переписать или, по крайней мере, найти и заменить файлы шаблонов), и вы должны включить (т.е. /path/to/my/code/examples) в настройке ALLOWED_INCLUDE_ROOTS в settings.py. (См. http://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi.)

Ответ 2

Django 1.5 решает эту проблему с verbatim тегом шаблона:

{% verbatim myblock %}
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}

Ответ 3

Возможное решение состоит в том, чтобы написать шаблоны как обычно (с {{ x }}), но сохранить их как .txt(или любое другое расширение, которое вы хотите). Напишите script пробежки по этим файлам и автоматически создайте .html для вас, выполнив обратную процедуру templatetag (заменив {{ на {% templatetag openvariable %} и т.д.). Убедитесь, что код запускается после обновления шаблонов.

Ответ 4

Я решил это, добавив тег шаблона "include_raw", который ведет себя как встроенный тег "include", но просто не анализирует и не обрабатывает переданный ему файл. Я запускаю Django 1.2 в App Engine.

Создайте модуль тегов (tags.py):

from django.template import loader
from google.appengine.ext.webapp import template

register = template.create_template_register()

@register.simple_tag
def include_raw(path):
  return loader.find_template(path)[0]

Зарегистрировать его:

from google.appengine.ext.webapp import template

template.register_template_library("tags")

Используйте его:

{% include_raw "this-will-be-included-verbatim.html" %}

Ответ 5

Если ваш источник является HTML, самым простым решением будет заменить "{" и "}" на соответствующие HTML-объекты:

{ становится {

} становится }

Пример:

<code>
To include some other file, you can use the &#123;% include %&#125; template tag. 
To include a variable, use &#123;%&#123;% varname &#125;%&#125;%.
</code>

Ответ 6

Вот элегантный способ решить проблему для Djano 1.4. Это пользовательский тег Django. Просто создайте модуль verbatim_templatetag.py, содержащий следующий код:

"""
jQuery templates use constructs like:

    {{if condition}} print something{{/if}}

This, of course, completely screws up Django templates,
because Django thinks {{ and }} mean something.

Wrap {% verbatim %} and {% endverbatim %} around those
blocks of jQuery templates and this will try its best
to output the contents with no changes.
"""

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))

Затем в вашем шаблоне: {% load verbatim_templatetag%}

Все между {% verbatim%} и {% endverbatim%} не будет проанализировано.

Код из https://gist.github.com/ericflo/629508