2010-05-08 73 views
11

我試圖輸出中文提供格式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小時的exp),但我會研究這一點。 – rxin 2010-05-08 23:07:55