前回の続きです。今回はテンプレートの記法についてもう少し踏み込んだ内容を学習しましょう。
空白行の制御
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>