plantilla:
{% 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 }}
resultado:
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?
Cree un método para asignar una variable global.
Contribuyendo con algunos detalles más. Así es como se ve el código anterior para tener una idea de lo que está sucediendo adentro:
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'
Más detalles:
Globales: http://jinja.pocoo.org/docs/api/#global -namespace
General: http://jinja.pocoo.org/docs/templates/#assignments
Implementación: http://jinja.pocoo.org/docs/api/#jinja2.runtime.Context
Otra buena explicación: http://stackoverflow.com/a/3355029/482864
¿Algunas ideas?
Este es un comportamiento documentado.
mitsuhiko,
Tenemos el mismo problema que DriverX.
Sí, el uso de "set" está documentado, pero, ¿está funcionando?
Nuestro ejemplo:
{% set the_var = 'foo'%} {% para e en elementos%} {% set the_var = 'YES'%} la var: {{the_var}} {% - endfor%} the_var: {{the_var}}
Resultado:
the_var: SÍ the_var: SÍ the_var: foo
¿Puedes ayudarnos? Gracias
http://stackoverflow.com/questions/4870346/can-a-jinja-variables-scope-extend-beyond-in-an-inner-block y http://stackoverflow.com/questions/9486393/jinja2-change- el-valor-de-una-variable-dentro-de-un-bucle
Realmente no entiendo por qué esos trucos son necesarios, deberían ser sintaxis "local var" o similar
Saludos
Comentario más útil
mitsuhiko,
Tenemos el mismo problema que DriverX.
Sí, el uso de "set" está documentado, pero, ¿está funcionando?
Nuestro ejemplo:
Resultado:
¿Puedes ayudarnos? Gracias