Jinja: {% set%} no asigna var al contexto global

Creado en 22 nov. 2012  ·  4Comentarios  ·  Fuente: pallets/jinja

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.

Comentario más útil

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

Todos 4 comentarios

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

¿Fue útil esta página
0 / 5 - 0 calificaciones