前回の続きです。今回はテンプレートの記法についてもう少し踏み込んだ内容を学習しましょう。
空白行の制御
trim_blocksとlstrip_blocks
テンプレートブロックはレンダリング時に空白行に置換されます。trim_blocksとlstrip_blocksの両方を有効にすると、テンプレートブロック行は削除され、他の空白は保持されます。以下のテンプレートについて考えてみましょう。
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
まず、デフォルトでEnvironmentを生成して出力を確認してみます。
from jinja2 import Template, Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('.'))
template = env.get_template('sample.tpl')
data = {'items': ['みかん', 'りんご', '<バナナ>']}
disp_text = template.render(data)
print(disp_text)
ブロック部分は空行に置換され、以下の出力が得られます。
<ul>
<li>みかん</li>
<li>りんご</li>
<li>バナナ</li>
</ul>
trim_blocksを有効にしてみるとどうなるでしょうか。trim_blocks=Trueを指定してみましょう。
# インスタンス生成時に指定する
env = Environment(loader=FileSystemLoader('.'), trim_blocks=True)
# もしくは、インスタンス生成後に指定する
env.trim_blocks = True
出力は以下の通りとなります。
<ul>
<li>みかん</li>
<li>りんご</li>
<li>バナナ</li>
</ul>
ブロック直後の空白をトリムする場合はlstrip_blocksを指定します。ただし、ブロック直後が空白のみの場合はlstrip_blocksの指定にかかわらず自動で空白が削除されます。
個別の設定
個別のブロックについて空白出力有無を設定することも可能です。以下のようにマイナスをつけると空行がなくなります。
<ul>
{% for item in items -%}
<li>{{ item }}</li>
{%- endfor %}
</ul>
特殊文字のエスケープ
{%などを含んだ文字列等がある場合、エスケープしたい箇所をrawブロックで囲みます。例えば、jinja2のテンプレート構文をテンプレートに書きたい場合は以下のように記述します。
{% raw %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
Line Statements
line_statement_prefixを指定するとブロックの記述方法を変更することができます。利用する側のpythonで以下のように設定します。
env.line_statement_prefix = '#'
すると、テンプレートファイルは以下のように記述することができます。
<ul>
# for item in seq
<li>{{ item }}</li>
# endfor
</ul>
