11

Djangoでbibtex形式で出力しようとしていますが、テンプレートは次のようになります。

@{{ 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 }}}
}

問題は{{{またはにあり{{%ます。この問題を回避する1つの方法は、最初の後にスペースを追加することです{が、そのような場合はフォーマットが改ざんされます。{Djangoテンプレートでエスケープする正しい方法は何ですか?

4

3 に答える 3

12

templatetagタグを見てください:

テンプレートタグの作成に使用される構文文字の1つを出力します。

テンプレートシステムには「エスケープ」の概念がないため、テンプレートタグで使用されているビットの1つを表示するには、タグを使用する必要があります{% templatetag %}

あなたが求めているのは:

{% templatetag openvariable %}

これは読みやすさを向上させないので、おそらくより良い解決策があります...

于 2010-05-08T17:02:35.877 に答える
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 %}
}

または、この段階でテンプレートを完全に除外することもできます。幸運を!

于 2010-05-08T22:42:22.493 に答える
1

templatetagテンプレートタグ付き。

title     = {% templatetag openvariable %}{% templatetag openbrace %} pubentry.title {% templatetag closevariable %}{% templatetag closebrace %},
于 2010-05-08T17:03:27.147 に答える