Jinja2: изменить значение переменной внутри цикла - PullRequest
54 голосов
/ 28 февраля 2012

Я хочу изменить значение переменной, объявленной вне цикла внутри цикла.Но всегда изменяясь, оно сохраняет начальное значение вне цикла.

{% set foo = False %}

{% for item in items %}
  {% set foo = True %}
  {% if foo %} Ok(1)! {% endif %}
{% endfor %}

{% if foo %} Ok(2)! {% endif %}

Это приводит к:

Ok(1)!

Таким образом, единственным (плохим) решением, найденным до сих пор, было следующее:

{% set foo = [] %}

{% for item in items %}
  {% if foo.append(True) %} {% endif %}
  {% if foo %} Ok(1)! {% endif %}
{% endfor %}

{% if foo %} Ok(2)! {% endif %}

Это делает:

Ok(1)!
Ok(2)!

Но это очень уродливо!Есть ли еще более элегантное решение?

Ответы [ 3 ]

56 голосов
/ 25 мая 2013

Попробуйте также словарный подход.Это кажется менее уродливым.

{% 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 %}

Это также делает:

Ok(1)!
Ok(2)!
21 голосов
/ 21 ноября 2017

, как указано в документации:

Обратите внимание, что назначения в циклах будут очищены в конце итерации и не смогут пережить область действия цикла.

, ноначиная с версии 2.10 вы можете использовать пространства имен:

    {% 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 %}
1 голос
/ 22 марта 2012

Вы можете сделать это, чтобы очистить код шаблона

{% 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 %}

А в коде сервера используйте

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)

Это можно обобщить до следующего

{{ 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 %}

А в коде сервера используйте

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...