Je souhaite définir des valeurs de variable, mais uniquement lorsqu'elles ne sont pas déjà affectées et dans un contexte local.Comment puis-je définir une variable (non globale) dans une fonction de contexte jinja?
Donc il y a une solution à ceci:
{% with x=(x | default(1)) %}
{{ x }}
{% endwith %}
{% with x=2 %}
{% with x=(x | default(1)) %}
{{ x }}
{% endwith %}
{% endwith %}
Cela fonctionne bien, mais il est beaucoup de texte. J'ai de nombreuses situations où je n'ai pas un seul mais jusqu'à 20 variables qui sont en train d'être définies et ensuite une macro est appelée, ou un modèle est inclus avec ces valeurs.
Écrire toutes ces conditions par défaut est juste un gâchis et provoque des erreurs. Donc, j'aimerais être en mesure de définir une valeur sur le contexte actuel, par exemple. dans une fonction de contexte. Mais si je les opérations suivantes:
@contextfunction
def defaults(ctx, **vals):
for k,v in vals.iteritems():
if k not in ctx:
ctx[k] = v
Je reçois la une exception:
TypeError: 'Context' object does not support item assignment
Et en essayant de définir une valeur sur ctx.vars ne contribuerait pas non plus:
vars
The template local variables. This list contains environment and context functions from the parent scope as well as local modifications and exported variables from the template. The template will modify this dict during template evaluation but filters and context functions are not allowed to modify it.
http://jinja.pocoo.org/docs/2.9/api/#jinja2.Context.vars
I essayé avec
@contextfunction
def defaults(ctx, **vals):
for k,v in vals.iteritems():
if k not in ctx.vars:
ctx.vars[k] = v
Et il ne donne pas exception, mais semble ne pas attribuer la valeur au contexte. Je sais que je pourrais écrire dans le contexte global mais ce n'est pas ce que je voudrais faire car cela produirait des effets secondaires.
Y a-t-il une possibilité d'obtenir juste le contexte actuel et de lui donner une valeur? Je n'ai trouvé aucune instruction là-dessus et comment cela a pu être fait et je n'ai pas vraiment compris cela en lisant la source jinja.