modèle:
{% set foo = "bar" %}
foo - {{ foo }}
{% for i in range(2) %}
for:foo - {{ foo }}
{% set foo = i %}
for:foo - {{ foo }}
{% endfor %}
{{ foo }}
{% block test %}
block:foo - {{ foo }}
{% set foo = "baz" %}
block:foo - {{ foo }}
{% endblock %}
foo - {{ foo }}
résultat:
foo - bar
for:foo - bar
for:foo - 0
for:foo - 0
for:foo - 1
foo - bar
block:foo - bar
block:foo - baz
foo - bar
wtf ?
Veuillez créer une méthode d'affectation d'une variable globale.
J'interviens avec quelques détails supplémentaires. Voici à quoi ressemble le code ci-dessus pour avoir une idée de ce qui se passe à l'intérieur :
from jinja2.runtime import LoopContext, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join, to_string, identity, TemplateNotFound
name = None
def root(context, environment=environment):
...
l_foo = 'bar'
context.vars['foo'] = l_foo
context.exported_vars.add('foo')
yield u'\nfoo - %s\n\n' % (
l_foo,
)
t_1 = l_foo
l_i = missing
for l_i in context.call(l_range, 2):
if 0: yield None
yield u'\n for:foo - %s\n ' % (
l_foo,
)
l_foo = l_i
yield u'\n for:foo - %s\n ' % (
l_foo,
)
l_foo = t_1
l_i = missing
yield u'\n\n'
for event in context.blocks['test'][0](context):
yield event
yield u'\n\nfoo - '
yield to_string(l_foo)
def block_test(context, environment=environment):
l_foo = context.resolve('foo')
if 0: yield None
yield u'\n block:foo - %s\n ' % (
l_foo,
)
l_foo = 'baz'
yield u'\n block:foo - %s\n' % (
l_foo,
)
blocks = {'test': block_test}
debug_info = '2=8&3=12&5=16&6=19&7=21&8=23&11=28&17=31&11=33&12=37&13=39&14=41'
Plus de détails:
Globals : http://jinja.pocoo.org/docs/api/#global -namespace
Général : http://jinja.pocoo.org/docs/templates/#assignments
Implémentation : http://jinja.pocoo.org/docs/api/#jinja2.runtime.Context
Une autre bonne explication : http://stackoverflow.com/a/3355029/482864
Des idées?
C'est un comportement documenté.
mitsuhiko,
Nous avons le même problème que DriverX.
Oui, l'utilisation de « set » est documentée, mais est-ce que cela fonctionne ?
Notre exemple :
{% définir the_var = 'foo' %} {% pour e dans les éléments %} {% définir the_var = 'OUI' %} la var : {{ the_var }} {%- endfor %} the_var : {{ the_var }}
Résultat:
the_var : OUI the_var : OUI the_var: foo
Pouvez-vous nous aider? Merci
http://stackoverflow.com/questions/4870346/can-a-jinja-variables-scope-extend-beyond-in-an-inner-block et http://stackoverflow.com/questions/9486393/jinja2-change- la-valeur-d'une-variable-dans-une-boucle
Je ne comprends vraiment pas pourquoi ces hacks sont nécessaires, devraient être la syntaxe "local var" ou similaire
Salutations
Commentaire le plus utile
mitsuhiko,
Nous avons le même problème que DriverX.
Oui, l'utilisation de « set » est documentée, mais est-ce que cela fonctionne ?
Notre exemple :
Résultat:
Pouvez-vous nous aider? Merci