web-dev-qa-db-fra.com

Comment passer les arguments sélectionnés et nommés au contexte d'inclusion de Jinja2?

En utilisant Django moteur de création de modèles, je peux inclure un autre modèle partiel tout en définissant un contexte personnalisé à l'aide d'arguments nommés, comme ceci:

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

Comme vous le supposez, articles_list1 et articles_list2 sont deux listes différentes, mais je peux réutiliser la même list.html modèle qui utilisera la variable articles.

J'essaie d'obtenir la même chose en utilisant Jinja2, mais je ne vois pas quelle est la méthode recommandée, car le mot clé with n'est pas pris en charge.

59
NiKo

Pour les lecteurs de 2017+, Jinja en date de 2.9 inclut l'instruction with par défaut. Aucune extension nécessaire.

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

Dans les anciennes versions de Jinja (avant 2.9), il était nécessaire d'activer cette fonctionnalité avec une extension. Il est désormais activé par défaut.

23

Jinja2 a ne extension qui active le mot clé with - il ne vous donnera pas la même syntaxe que Django, et il se peut qu'il ne fonctionne pas comme vous le prévoyez mais vous pouvez le faire:

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

Toutefois, si list.html fonctionne simplement comme un moyen de créer une liste, alors vous voudrez peut-être la changer en macro à la place - cela vous donnera beaucoup plus de flexibilité.

{% 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

De cette façon, vous pouvez passer plusieurs variables à Jinja2 Inclure instruction en divisant les variables par une virgule à l'intérieur --- (Avec instruction):

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