更改循环内变量的值
- 2025-03-19 08:56:00
- admin 原创
- 46
问题描述:
我想在循环内更改循环外声明的变量的值。但是,即使在循环内更改命中,它仍会保留循环外的初始值。
{% 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)!
但是,它太丑了!还有其他更优雅的解决方案吗?
解决方案 1:
正如文档中提到的:
请注意,循环中的赋值将在迭代结束时被清除,并且不能超出循环范围。
但从 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 %}
解决方案 2:
也可以尝试基于字典的方法。它似乎不那么丑陋。
{% 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)!
解决方案 3:
您可以这样做来清理模板代码
{% 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)
解决方案 4:
我也陷入了这个问题,直到我意识到问题所在,而且解决方案确实很糟糕。我猜你使用的是 flask 和 python。我想到更优雅的解决方案是在 python 中对变量执行这些操作,而不是在那里,然后只需通过 render_template 传递最终值。希望这对你有帮助。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD