Для нового проекта мы пишем документацию о системе шаблонов Django. Мы также используем Django для самого проекта документации, поэтому Django отображает все наши примерные переменные в примере кода и пытается их отобразить. Единственный способ найти это - использовать {% templatetag%}, но это делает наш код действительно нечитаемым. Возможно ли, чтобы Django игнорировал все переменные шаблона в определенном разделе?
Легкий способ избежать шаблонов шаблонов Django
Ответ 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 {% include %} template tag.
To include a variable, use {%{% varname }%}%.
</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%} не будет проанализировано.