Wie werden ausgewählte, benannte Argumente an den Include-Kontext von Jinja2 übergeben?

73

Mit der Django-Vorlagen-Engine kann ich eine andere Teilvorlage einfügen, während ich einen benutzerdefinierten Kontext mit benannten Argumenten wie folgt einstelle:

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

Wie Sie Gesetzt sein können, articles_list1und articles_list2sind zwei verschiedene Listen, aber ich kann die gleiche Wiederverwendung list.htmlVorlage , die das verwenden werden articlesvariabel.

Ich versuche, mit Jinja2 dasselbe zu erreichen, aber ich kann nicht sehen, wie dies empfohlen wird, da das withSchlüsselwort nicht unterstützt wird.

NiKo
quelle

Antworten:

34

Für Leser ab 2017 enthält Jinja ab standardmäßig 2.9die withErklärung. Keine Verlängerung notwendig.

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

In älteren Versionen von Jinja (vor 2.9) war es erforderlich, diese Funktion mit einer Erweiterung zu aktivieren. Es ist jetzt standardmäßig aktiviert.

Yuji 'Tomita' Tomita
quelle
Nun, ich finde mich 2017 wieder und es funktioniert nicht. Probleme mit der Bereitstellung eines Links?
Pithikos
1
@Pithikos jinja.pocoo.org/docs/2.9/templates/#with-statement "In älteren Versionen von Jinja (vor 2.9) musste diese Funktion mit einer Erweiterung aktiviert werden. Sie ist jetzt standardmäßig aktiviert."
Yuji 'Tomita' Tomita
127

Jinja2 hat eine Erweiterung , die das withSchlüsselwort aktiviert - es gibt Ihnen nicht die gleiche Syntax wie Django und es funktioniert möglicherweise nicht so, wie Sie es erwarten, aber Sie könnten dies tun:

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

Wenn dies list.htmljedoch im Grunde nur als Möglichkeit zum Erstellen einer Liste dient, möchten Sie diese möglicherweise in eine Liste ändern. macroDies gibt Ihnen viel mehr Flexibilität.

{% 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) }}
Sean Vieira
quelle
59

Auf diese Weise können Sie mehrere Variablen an die Jinja2 Include- Anweisung übergeben - (indem Sie Variablen innerhalb der With- Anweisung durch Komma aufteilen ):

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