Как представить "{{" в шаблоне django?
Я пытаюсь вывести в формате bibtex в Django, и шаблон выглядит следующим образом:
@{{ pubentry.type }{,
author = {{% for author in pubentry.authors.all %}{{ author.first_name }} {{ author.middle_name }} {{ author.last_name }}{% if not forloop.last %} and {% endif %}
{% endfor %}},
title = {{{ pubentry.title }}},
journal = {{{ pubentry.journal }}}
}
Проблема заключается в {{{
или {{%
. Один из способов обойти проблему состоит в том, чтобы добавить пробел после первого {
, но такой тип вмешательства в формат. Какой правильный способ избежать {
в шаблонах Django?
Ответы
Ответ 1
Посмотрите на тег templatetag:
Вывести один из синтаксических символов, используемых для создания тегов шаблонов.
Поскольку в системе шаблонов нет понятия "экранирование" , чтобы отобразить один из битов, используемых в тегах шаблона, вы должны использовать тег {% templatetag %}
.
Зачем вам нужно:
{% templatetag openvariable %}
Возможно, есть более приятное решение, потому что это не повышает удобочитаемость...
Ответ 2
Другим (более гибким) подходом может быть преобразование значений в значение типа bibtex перед отправкой их в шаблон. Вероятно, вам все равно придется это сделать, чтобы избежать некоторых символов, которые не могут обрабатывать bibtex/latex. Вот что-то подобное я подготовил раньше:
import datetime
class BibTeXString(unicode):
pass
def bibtex_repr(obj):
""" A version of the string repr method, that always outputs variables suitable for BibTeX. """
# If this has already been processed, it ok
if isinstance(obj, BibTeXString):
return obj
# Translate strings
if isinstance(obj, basestring):
value = unicode(obj).translate(CHAR_ESCAPES).strip()
return BibTeXString('{%s}' % value)
# Dates
elif isinstance(obj, datetime.date):
return BibTeXString('{%02d-%02d-%02d}' % (obj.year, obj.month, obj.day))
# Integers
if isinstance(obj, (int, long)):
return BibTeXString(str(obj))
else:
return BibTeXString(repr(obj))
CHAR_ESCAPES = {
ord(u'$'): u'\\$',
ord(u'&'): u'\\&',
ord(u'%'): u'\\%',
ord(u'#'): u'\\#',
ord(u'_'): u'\\_',
ord(u'\u2018'): u'`',
ord(u'\u2019'): u"'",
ord(u'\u201c'): u"``",
ord(u'\u201d'): u"''" ,
ord(u'\u2014'): u'---',
ord(u'\u2013'): u'--',
}
Вы даже можете использовать это в качестве фильтра шаблонов, если хотите, чтобы ваш шаблон выглядел следующим образом:
@{{ pubentry.type }{,
author = {% filter bibtex %}{% for author in pubentry.authors.all %}{{ author.first_name }} {{ author.middle_name }} {{ author.last_name }}{% if not forloop.last %} and {% endif %}{% endfor %}}{% endfilter %},
title = {{ pubentry.title|bibtex }},
journal = {{ pubentry.journal|bibtex }}
}
Но я бы избежал содержимого до того, как он попадет в шаблон, так что ваш шаблон просто должен это сделать:
@{{ pubentry.type }{,
{% for field in fields %}{{ field }}{% if not forloop.last %},{% endif %}{% endfor %}
}
Или вообще не оставляйте шаблон на этом этапе. Удачи!
Ответ 3
С тегом templatetag
.
title = {% templatetag openvariable %}{% templatetag openbrace %} pubentry.title {% templatetag closevariable %}{% templatetag closebrace %},