jinja2入門 その2

前回の続きです。今回はテンプレートの記法についてもう少し踏み込んだ内容を学習しましょう。

空白行の制御

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>