如何获取传递给Jinja2模板的所有参数的列表?
如果我有一个非常通用的模板,并且我想列出所有传递的参数(出于调试原因)有没有办法呢?
类似的东西:
mytemplate.html
{% for argument in LIST_OF_ARGUMENT %}
{{ argument }}<br>
{% endfor %}
所以在视图中/foobar
如果我以这种方式调用模板:
return render_template('mytemplate.html', form=myform, foo='bar')
我得到了
the_content_of_form <br>
bar <br>
如果我以这种方式调用模板:
return render_template('mytemplate.html', lorem=ipsum, fooooo='barrrrr')
我得到了
the_content_of_lorem <br>
barrrrr <br>
答案 0 :(得分:1)
嗯,你只需要将它们作为参数传递给render_template,可能最常见的用法是将一个字典列表作为参数传递给渲染模板:
def Viewfunction():
#do something, get something from db as result and then
arguments = [dict(name=row[0],age=row[1]) for row in result.fetchall()]
return render_template('mytemplate.html', form=myform, arguments=arguments)
然后像这样访问它们:
{% for item in arguments %}
{{ item.name }}
{{ item.age }}
{% endfor %}
显然,你也可以将所有其他列表,而不仅仅是字典列表传递给模板,然后以非常类似的方式遍历它们。
至于调试我发现Flask内置的调试工具非常有用,如果你得到一个例外,你只需要一个可以执行代码的页面,如果你对所有变量感兴趣,你可以简单地键入locals()进入stacktrace中的一个框架。您只需启用调试模式即可使用它,只需记住在生产中将其关闭即可。
这是一个适合您的工作示例,当您在示例文件夹下载它时,它取自烧瓶中的flaskr示例应用程序:
@app.route('/')
def show_entries():
db = get_db()
cur = db.execute('select title, text from entries order by id desc')
entries = cur.fetchall()
return render_template('show_entries.html', entries=entries,local=locals())
当你这样做时:
{% for item in local %}
{{ item }}
{% endfor %}
你会得到db cur条目,这是你想要的吗?
答案 1 :(得分:0)
“模板上下文包含模板的变量。它存储传递给模板的值以及模板导出的名称”
“模板上下文支持只读dict操作(get,keys,values,items,iterkeys,itervalues,iteritems, getitem ,包含)。另外还有一个resolve()方法,该方法不会因KeyError而失败,但会为缺少的变量返回Undefined对象。“