[英]For loop inside block assignment?
這是一個基本循環,在賦值塊之外編譯得很好:
{% for item in items %}
<p>{{item}}</p>
{% endfor %}
但是當我將循環放在賦值塊內時,就像這樣
{% 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>
,因此我想循環遍歷列表中的元素,將每個元素包裝在<li>
標簽中,然后傳遞結果html 作為宏的參數。 因此我的問題。
是否可以在分配塊內使用 for 循環? 還是有更好的方法來實現同樣的目標?
基於AssertionError: 試圖將名稱解析為框架未知的引用,此問題僅在Jinja2
版本3.x
中出現。 舊版本2.x
可以正常工作。
此時它需要在塊中使用它之前設置變量。 也許稍后他們會修復它。
{% set item = None %}
{% set stuff %}
{% for item in items %}
<p>{{item}}</p>
{% endfor %}
{% endset %}
{{ stuff }}
但是set
對我來說有一個很大的缺點:它不能得到 arguments 並且它只適用於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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.