Peut un Jinja variable du champ d'application s'étendre au-delà dans un bloc interne?
J'ai le texte suivant Jinja modèle:
{% set mybool = False %}
{% for thing in things %}
<div class='indent1'>
<ul>
{% if current_user %}
{% if current_user.username == thing['created_by']['username'] %}
{% set mybool = True %}
<li>mybool: {{ mybool }}</li> <!-- prints True -->
<li><a href='#'>Edit</a></li>
{% endif %}
{% endif %}
<li>Flag</li>
</ul>
</div>
<hr />
{% endfor %}
{% if not mybool %}
<!-- always prints this -->
<p>mybool is false!</p>
{% else %}
<p>mybool is true!</p>
{% endif %}
Si la condition est remplie dans le for
boucle, j'aimerais changer mybool
vrai, alors je peux afficher mybool is true!
ci-dessous. Cependant, il semble que la portée de l'intérieur de la mybool
est limitée à la if
déclaration, de sorte que le souhaité mybool
n'est jamais réglé.
Comment puis-je définir le "global" mybool
donc je peux l'utiliser dans la dernière if
déclaration?
MODIFIER
J'ai trouvé quelques suggestions (uniquement la page en cache les vues correctement), mais ils ne semblent pas fonctionner. Peut-être qu'ils sont déconseillés dans Jinja2...
MODIFIER
Solution fournie ci-dessous. Je suis toujours curieux de savoir pourquoi les suggestions ci-dessus ne fonctionnent pas bien. Personne ne sait pour sûr qu'ils ont été déconseillés?
- Ce n'est pas la réponse à votre question, mais vous pourriez tout simplement
mybool
comme une variable de contexte et la passer dans le modèle - C'est une bonne réflexion, mais malheureusement il ne fonctionne pas. Dès que vous utilisez un "set" dans le modèle, la portée de cette variable est locale.
- > la Solution fournie ci-dessous. Je suis toujours curieux de savoir pourquoi les suggestions ci-dessus ne fonctionnent pas bien. Personne ne sait pour sûr qu'ils ont été déconseillés? Ils ont été supprimé car il n'est pas possible dans le code généré pour bien prédire dans quelle mesure elles ont à faire des bulles sur la pile de Python. Il serait possible avec certains hacks mais ça ne vaut pas la peine. Garder la logique des modèles 🙂
Vous devez vous connecter pour publier un commentaire.
Un moyen de contourner cette limitation est de permettre à l' "faire" de l'expression-déclaration d'extension et utiliser un tableau à la place de booléenne:
Pour permettre à Jinja "ne" expression d'une déclaration d'extension:
e = jinja2.Environment(extensions=["jinja2.ext.do",])
{% if exists.append(1) %}{% endif %}
do
expression:{% set _ = exists.append(1) %}
. C'est une pratique courante dans le DebOps projet (Ansible genre de trucs).Réponse à une question connexe: je voulais avoir un mondial de lutte contre le nombre de fois que je suis entré dans un certain si-bloc dans le modèle, et terminé avec le ci-dessous.
En haut du modèle:
Dans le si-bloc je veux count:
Lors de l'affichage du compte:
La chaîne
'1'
peut être remplacé par n'importe quel chaîne de caractères ou de chiffres, je crois. Il est encore un hack, mais pas un très gros.Vous pouvez résoudre votre problème à l'aide de ce hack (sans les extensions):
Mise à jour 2018
De Jinja 2.10 (8 Novembre 2017) il y a un
namespace()
objet de résoudre ce problème particulier. Voir l'officiel Affectations documentation pour plus de détails et un exemple; leclass
de la documentation puis montre comment attribuer plusieurs valeurs à un espace de noms.Lors de l'écriture d'un
contextfunction()
ou quelque chose de similaire, vous avez sûrement remarqué que le contexte essaie d'arrêter de le modifier.Si vous avez réussi à modifier le contexte à l'aide d'un contexte interne de l'API vous avez peut-être remarqué que les changements dans le contexte ne semble pas être visible dans le modèle. La raison pour cela est que
Jinja
utilise le contexte seulement comme source principale de données pour les variables de modèle pour des raisons de performances.Si vous souhaitez modifier le contexte écrire une fonction qui renvoie une variable que l'on peut affecter à une variable à l'aide de set:
{% set comments = get_latest_comments() %}
Source
Avait besoin de trouver le max num d'entrées dans un objet (objet) à partir d'une liste (objects_from_db),
Cela ne fonctionne pas pour des raisons connues dans jinja2 et de la portée des variables.
Voici ce qui fonctionne:
Espère que cela aide quelqu'un d'autre à essayer de comprendre la même chose.
Trouvé ce grand l'article qui décrit un peu de bidouille. Il n'est pas possible de modifier la valeur d'un jinja variable dans un autre champ, mais il est possible de modifier un dictionnaire mondial des valeurs:
J'ai aussi trouvé très utile cette syntaxe pour définir la valeur sans l'aide de
set
:Il fait vérifie le résultat d'une
update
opération sur un dictionnaire (note à moi-même).