web-dev-qa-db-ja.com

選択した名前付き引数をJinja2のインクルードコンテキストに渡す方法

Djangoテンプレートエンジンを使用すると、次のように、名前付き引数を使用してカスタムコンテキストを設定するときに別の部分テンプレートを含めることができます。

{% include "list.html" with articles=articles_list1 only %}
{% include "list.html" with articles=articles_list2 only %}

ご想像のとおり、articles_list1およびarticles_list2は2つの異なるリストですが、まったく同じlist.htmlテンプレートは、articles変数を使用します。

Jinja2を使用して同じことを達成しようとしていますが、withキーワードがサポートされていないため、推奨される方法がわかりません。

59
NiKo

2017年以降の読者の場合、2.9には、デフォルトでwithステートメントが含まれます。拡張は必要ありません。

http://jinja.pocoo.org/docs/2.9/templates/#with-statement

Jinjaの古いバージョン(2.9以前)では、拡張機能を使用してこの機能を有効にする必要がありました。現在、デフォルトで有効になっています。

23

Jinja2には 拡張機能 があり、これにより with キーワードが有効になります-Djangoと同じ構文が得られず、予想どおりに機能しない場合がありますしかし、あなたはこれを行うことができます:

{% with articles=articles_list1 %}
    {% include "list.html" %}
{% endwith %}
{% with articles=articles_list2 %}
    {% include "list.html" %}
{% endwith %}

ただし、list.htmlは基本的にリストを作成する方法として機能しているので、代わりに macro に変更することをお勧めします-これにより柔軟性が大幅に向上します。

{% macro build_list(articles) %}
    <ul>
        {% for art in articles %}
            <li>{{art}}</li>
        {% endfor %}
    </ul>
{% endmacro %}

{# And you call it thusly #}
{{ build_list(articles_list1) }}
{{ build_list(articles_list2) }}
115
Sean Vieira

この方法で、複数の変数をJinja2に渡すことができますInclude文-(by変数をカンマで分割するWithステートメント):

            {% with var_1=123, var_2="value 2", var_3=500 %}
                {% include "your_template.html" %}
            {% endwith %}
40
pymen