他のテンプレート エンジンから切り替え

これは、Jinja の構文と他のテンプレート言語の構文の違いに関する簡単なガイドです。Jinja の構文と機能についての包括的なガイドについては、テンプレート デザイナドキュメント を参照してください。

Django

以前 Django のテンプレートを使用していた場合、Jinja は非常に使い慣れたものに見えるでしょう。構文要素の多くは同じように見えて、同じように動作します。ただし、Jinja は、さらにいくつかの構文要素を提供しており、一部の動作は少し異なります。

このセクションでは、テンプレートの変更について説明します。拡張のサポートを含む API は根本的に異なるため、ここでは説明しません。

Django は Jinja をそのテンプレート エンジンとして使用できます。https://docs.djangoproject.com/en/stable/topics/templates/#support-for-template-engines を参照してください。

メソッド呼び出し

Django では、メソッドは括弧なしで暗黙的に呼び出されます。

{% for page in user.get_created_pages %}
    ...
{% endfor %}

Jinja では、Python のように、呼び出しには括弧が必要です。これにより、Django では不可能な変数をメソッドに渡すことができます。この構文は、マクロ呼び出しにも使用されます。

{% for page in user.get_created_pages() %}
    ...
{% endfor %}

フィルタ引数

Django では、コロンの後に 1 つのリテラル値をフィルタに渡すことができます。

{{ items|join:", " }}

Jinja では、フィルタは、関数呼び出しのように、任意の数の位置引数とキーワード引数を括弧内に取ることができます。引数は、リテラル値ではなく、変数でもかまいません。

{{ items|join(", ") }}

テスト

Jinja にはフィルタに加えて、「テスト」もあり、is 演算子で使用されます。この演算子は、Python の演算子とは異なります。

{% if user.user_id is odd %}
    {{ user.username|e }} is odd
{% else %}
    hmm. {{ user.username|e }} looks pretty normal
{% endif %}

ループ

Django では、ループ コンテキストの特別な変数は forloop と呼ばれ、empty はループ アイテムがない場合に使用されます。

{% for item in items %}
    {{ forloop.counter }}. {{ item }}
{% empty %}
    No items!
{% endfor %}

Jinja では、ループ コンテキストの特別な変数は loop と呼ばれ、else ブロックはループ アイテムがない場合に使用されます。

{% for item in items %}
    {{ loop.index }}. {{ item }}
{% else %}
    No items!
{% endfor %}

サイクル

Django では、{% cycle %} はループ内で使用して、ループごとに値を切り替えることができます。

{% for user in users %}
    <li class="{% cycle 'odd' 'even' %}">{{ user }}</li>
{% endfor %}

Jinja では、loop コンテキストに cycle メソッドがあります。

{% for user in users %}
    <li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
{% endfor %}

サイクラは変数に割り当てて、cycle() グローバル関数を使用してループの外側またはループ間で使用することもできます。

Mako

Jinja を Mako にさらに近づけるように設定できます。

env = Environment(
    block_start_string="<%",
    block_end_string="%>",
    variable_start_string="${",
    variable_end_string="}",
    comment_start_string="<%doc>",
    commend_end_string="</%doc>",
    line_statement_prefix="%",
    line_comment_prefix="##",
)

このように環境を設定すると、Jinja は一部の Mako テンプレートのサブセットを何も変更することなく解釈できるようになります。

Jinja は埋め込み Python コードをサポートしていないため、テンプレートの外に出す必要があります。レンダリング前に同じコードでデータを処理するか、Jinja 環境にグローバル関数またはフィルタを追加できます。

defs(Jinja ではマクロと呼ばれます)とテンプレート継承の構文も異なります。

次の Mako テンプレートは

<%inherit file="layout.html" />
<%def name="title()">Page Title</%def>
<ul>
% for item in list:
    <li>${item}</li>
% endfor
</ul>

上の設定で Jinja でこう表現されます

<% extends "layout.html" %>
<% block title %>Page Title<% endblock %>
<% block body %>
<ul>
% for item in list:
    <li>${item}</li>
% endfor
</ul>
<% endblock %>