另一種(更靈活的)方法可能是在將值發送到模板之前將其轉換爲類似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 %}
}
甚至在此階段完全省略模板。祝你好運!
謝謝!聽起來很有趣 - 我仍在學習Django/Python(到目前爲止8小時的exp),但我會研究這一點。 – rxin 2010-05-08 23:07:55