更改循环内变量的值

问题描述 投票:0回答:4

我想在循环内更改循环外声明的变量的值。但是,即使在循环内更改 hit,它也会将初始值保留在循环外。

{% 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)!

但是,实在是太丑了!还有其他更优雅的解决方案吗?

python jinja2
4个回答
103
投票

文档中所述:

请注意,循环中的分配将在结束时被清除 迭代并且不能超出循环范围。

但从版本 2.10 开始,你可以使用 namespaces:

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

101
投票

也尝试基于字典的方法。好像没那么丑了

{% 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)!

0
投票

您可以这样做来清理模板代码

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

0
投票

我也被困在这个问题上,直到我意识到问题所在,是的,解决方案很丑陋。我猜你正在使用flask和python。我想出的更优雅的解决方案是在 python 中对变量进行这些操作,而不是在那里,然后通过 render_template 传递最终值。希望有帮助。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.