python - true - Jinja2: cambia el valor de una variable dentro de un bucle
while en python 3 (3)
Podrías hacer esto para limpiar el código de la plantilla.
{% for item in items %}
{{ set_foo_is_true(local_vars) }}
{% if local_vars.foo %} Ok(1)! {% endif %}
{% endfor %}
{% if local_vars.foo %} Ok(2)! {% endif %}
Y en el uso del código del servidor.
items = [''item1'', ''item2'', ''item3'']
#---------------------------------------------
local_vars = { ''foo'': False }
def set_foo_is_true(local_vars):
local_vars[''foo''] = True
return ''''
env.globals[''set_foo_is_true''] = set_foo_is_true
#---------------------------------------------
return env.get_template(''template.html'').render(items=items, local_vars=local_vars)
Esto podría generalizarse a los siguientes
{{ set_local_var(local_vars, "foo", False) }}
{% for item in items %}
{{ set_local_var(local_vars, "foo", True) }}
{% if local_vars.foo %} Ok(1)! {% endif %}
{% endfor %}
{% if local_vars.foo %} Ok(2)! {% endif %}
Y en el uso del código del servidor.
items = [''item1'', ''item2'', ''item3'']
#---------------------------------------------
local_vars = { ''foo'': False }
def set_local_var(local_vars, name, value):
local_vars[name] = value
return ''''
env.globals[''set_local_var''] = set_local_var
#---------------------------------------------
return env.get_template(''template.html'').render(items=items, local_vars=local_vars)
Quiero cambiar el valor de la variable declarada fuera del bucle dentro de un bucle. Pero siempre cambiando, mantiene el valor inicial fuera del bucle.
{% set foo = False %}
{% for item in items %}
{% set foo = True %}
{% if foo %} Ok(1)! {% endif %}
{% endfor %}
{% if foo %} Ok(2)! {% endif %}
Esto hace que:
Ok(1)!
Así que la única solución (mala) que hemos encontrado hasta ahora fue esta:
{% set foo = [] %}
{% for item in items %}
{% if foo.append(True) %} {% endif %}
{% if foo %} Ok(1)! {% endif %}
{% endfor %}
{% if foo %} Ok(2)! {% endif %}
Esto hace que:
Ok(1)!
Ok(2)!
Pero, es muy feo! ¿Hay otra solución más elegante?
Pruebe también el enfoque basado en el diccionario. Parece ser menos feo.
{% set vars = {''foo'': False} %}
{% for item in items %}
{% if vars.update({''foo'': True}) %} {% endif %}
{% if vars.foo %} Ok(1)! {% endif %}
{% endfor %}
{% if vars.foo %} Ok(2)! {% endif %}
Esto también hace que:
Ok(1)!
Ok(2)!
como se menciona en la documentación:
Tenga en cuenta que las asignaciones en bucles se borrarán al final de la iteración y no pueden superar el alcance del bucle.
pero a partir de la versión 2.10 puede usar espacios de nombres:
{% set ns = namespace(foo=false) %}
{% for item in items %}
{% set ns.foo = True %}
{% if ns.foo %} Ok(1)! {% endif %}
{% endfor %}
{% if ns.foo %} Ok(2)! {% endif %}