109 votes

Comment passer des arguments sélectionnés et nommés au contexte inclus de Jinja2?

En utilisant le moteur de template Django, je peux inclure un autre template partiel tout en définissant un contexte personnalisé en utilisant des arguments nommés, comme ceci:

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

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

Je cherche à réaliser 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.

169voto

Sean Vieira Points 47080

Jinja2 a le mot-clé with - il ne vous donnera pas la même syntaxe que Django, et il peut ne pas fonctionner comme vous l'attendez mais vous pourriez faire ceci :

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

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

{% macro build_list(articles) %}

        {% for art in articles %}
            {{art}}
        {% endfor %}

{% endmacro %}

{# Et vous l'appelez ainsi #}
{{ build_list(articles_list1) }}
{{ build_list(articles_list2) }}

Pour utiliser ce macro depuis un autre template, importez-le :

{% from "build_list_macro_def.html" import build_list %}

79voto

pymen Points 49

De cette façon, vous pouvez passer plusieurs variables à l'instruction Include de Jinja2 - (en séparant les variables par des virgules à l'intérieur de l'instruction With):

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

50voto

Yuji 'Tomita' Tomita Points 46106

Pour les lecteurs en 2017+, Jinja à partir 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. Elle est maintenant activée par défaut.

14voto

Rami Alloush Points 104

Mis à jour 2021+

Les modèles inclus ont accès aux variables du contexte actif par défaut. Pour plus de détails sur le comportement du contexte des importations et des inclusions, consultez Comportement du Contexte d'Importation.

À partir de Jinja 2.2, vous pouvez marquer une inclusion avec ignore missing; auquel cas Jinja ignorera l'instruction si le modèle à inclure n'existe pas. Lorsqu'il est combiné avec with ou without context, il doit être placé avant l'instruction de visibilité du contexte. Voici quelques exemples valides :

{% include "sidebar.html" ignore missing %}
{% include "sidebar.html" ignore missing with context %}
{% include "sidebar.html" ignore missing without context %}

2voto

Dany Points 3112

Une autre option, sans plugins, consiste à utiliser des macros et à les inclure à partir d'un autre fichier :

fichier macro.j2

{% macro my_macro(param) %}
  {{ param }}
{% endmacro %}

fichier main.j2

{% from 'macro.j2' import my_macro %}

{{ my_macro(param) }}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X