Как представить “{{” в шаблоне 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?

11
задан Török Gábor 8 November 2010 в 19:18
поделиться

3 ответа

Обратите внимание на тег templatetag tag:

Выводит один из синтаксических символов, используемых для создания тегов шаблона.

Поскольку в системе шаблонов отсутствует концепция «экранирования» , для отображения одного из битов, используемых в тегах шаблонов, необходимо использовать тег {% templatetag%} .

Что вам нужно:

{% templatetag openvariable %}

Может быть, есть более хорошее решение, потому что это не увеличивает читаемость ...

12
ответ дан 3 December 2019 в 07:36
поделиться

Другим (более гибким) подходом может быть преобразование значений в 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's 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
ответ дан 3 December 2019 в 07:36
поделиться

С тегом templatetag тегом шаблона.

title     = {% templatetag openvariable %}{% templatetag openbrace %} pubentry.title {% templatetag closevariable %}{% templatetag closebrace %},
1
ответ дан 3 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: