本文介绍了对于挡路赋值中的循环?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!
问题描述
这里是一个初级循环,在赋值挡路之外编译得很好:
{% 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循环?或者有没有更好的方法来实现同样的目标?
推荐答案
基于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()
这篇关于对于挡路赋值中的循环?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!
The End


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)