用于块内循环赋值?

2024-09-29 19:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

下面是一个基本循环,当位于赋值块之外时,它可以很好地编译:

{% for item in items %}
  <p>{{item}}</p>
{% endfor %}

但是当我把循环放在assignment block的内部时,就像这样

{% set stuff %}
  {% for item in items %}
    <p>{{item}}</p>
  {% endfor %}
{% endset %}

我得到AssertionError: Tried to resolve a name to a reference that was unknown to the frame ('item')

这个问题的动机是我使用宏来避免代码重复。例如,我有许多不同字段的div。其中一个div包含给用户的消息。在一种(但只有一种)情况下,我希望在这个div中包含一个<ul>,因此我希望在将结果html作为参数传递给宏之前,在列表中遍历元素,将每个元素包装在<li>标记中。这就是我的问题

是否可以在赋值块内部使用for循环?还是有更好的方法实现同样的目标


Tags: toindiv元素foritemsitemblock
1条回答
网友
1楼 · 发布于 2024-09-29 19:32:31

基于AssertionError: Tried to resolve a name to a reference that was unknown to the frame,这个问题只存在于Jinja2版本3.x中。旧版本2.x工作正常

此时,在块中使用变量之前,需要设置变量。也许以后他们会修好的

{% set item = None %}

{% set stuff %}
  {% for item in items %}
    <p>{{item}}</p>
  {% endfor %}
{% endset %}

{{ stuff }}

但是set对我来说有一个很大的缺点:它不能获取参数,而且它只对items有效。
如果我设置{% set items = other_items %},它就不能工作

我宁愿把代码放在macro中使用stuff(main_items)stuff(other_items)等等

{% macro stuff(items) %}
  {% for item in items %}
    <p>{{item}}</p>
  {% endfor %}
{% endmacro %}

{{ stuff(main_items) }}

{{ stuff(other_items) }}

最低工作代码:

from flask import Flask, render_template_string

app = Flask(__name__)

@app.route('/')
def index():
    return render_template_string('''
<h1>SET</h1>

{% set item = None %}

{% set stuff_set %}
  {% for item in items %}
    <p>{{item}}</p>
  {% endfor %}
{% endset %}

{{ stuff_set }}

<h1>MACRO</h1>

{% macro stuff_macro(items) %}
  {% for item in items %}
    <p>{{item}}</p>
  {% endfor %}
{% endmacro %}

{{ stuff_macro(main_items) }}
{{ stuff_macro(other_items) }}
''', items=['A', 'B', 'C'], main_items=[1,2,3], other_items=[4,5,6])

if __name__ == '__main__':
    #app.debug = True 
    app.run()

相关问题 更多 >

    热门问题