Простой способ избежать переменных шаблона Django - PullRequest
15 голосов
/ 02 февраля 2010

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

Ответы [ 6 ]

15 голосов
/ 19 июня 2012

Django 1.5 решает эту проблему с помощью тега шаблона дословно . Он также отлично работает с текущими версиями Django.

{% verbatim myblock %}
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}
7 голосов
/ 02 февраля 2010

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

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

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

3 голосов
/ 25 апреля 2012

Если вашим источником является 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>
3 голосов
/ 25 марта 2011

Я решил эту проблему, добавив тег шаблона 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" %}
3 голосов
/ 02 февраля 2010

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

0 голосов
/ 03 июня 2013

Вот элегантный способ решения проблемы для 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...