2010-05-08 5 views
11

Я пытаюсь вывести в формате BibTeX в Django и шаблон выглядит следующим образом:Как представить "{{" в шаблоне 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?

ответ

12

Посмотрите на templatetag тег:

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

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

Что вы после:

{% templatetag openvariable %} 

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

1

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

title  = {% templatetag openvariable %}{% templatetag openbrace %} pubentry.title {% templatetag closevariable %}{% templatetag closebrace %}, 
3

Другим (более гибким) подходом может быть преобразование значений в значение типа 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 %} 
} 

Или даже выйти из шаблона в целом на данном этапе. Удачи!

+0

Спасибо! Звучит интересно - я все еще изучаю Django/Python (8 часов опыта до сих пор), но я буду изучать это. – rxin