簡體   English   中英

塊分配內的循環?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM