読者です 読者をやめる 読者になる 読者になる

神社参拝(2) 空白の扱い

Python Jinja Django

Djangoのテンプレートだと、

{% for item in seq %}
  {{ item }}
{% endfor %}

のようなテンプレートを書いたときに、出力結果は、例えばseqにrange(3)を与えたとすると、

0

1

2

のように、空白(改行コード)が入ってしまう。これはignorable whitespaceが明確なXHTML/XMLのような文書を出力するならばそれほど困らないのだが、text/plainのメールの本文のような改行・空白が有意な文書を出力する時には結構気を使ったりする。

Jinjaならば、この問題に対処するには、開始タグ/終了タグにハイフン(-)を挟めばよい。次の例では、開始タグを{% for -%}とし、終了タグを{%- endfor %}としているので、開始タグの後と終了タグの前の空白が除去されて、結果としてu'012'という文字列が出力されている。

>>> from jinja2 import Template
>>> tmpl = Template("""{% for item in seq -%}
... {{ item }}
... {%- endfor %}""")
>>> tmpl.render(seq=range(3))
u'012'

終了タグ{% endfor %}の直前の空白だけを除去するならば、

>>> tmpl = Template("""{% for item in seq %}
... {{ item }}
... {%- endfor %}""")
>>> tmpl.render(seq=range(3))
u'\n0\n1\n2'

開始タグ{% for %}の直後の空白だけを除去するならば、

>>> tmpl = Template("""{% for item in seq -%}
... {{ item }}
... {% endfor %}""")
>>> tmpl.render(seq=range(3))
u'0\n1\n2\n'