5

如何获取传递给 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>
4

2 回答 2

2

好吧,您只需要将它们作为参数传递给 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 条目,这是你想要的吗?

于 2013-08-05T17:24:32.037 回答
0

看看jinja2.runtime.Context

“模板上下文包含模板的变量。它存储传递给模板的值以及模板导出的名称”

“模板上下文支持只读 dict 操作(get、keys、values、items、iterkeys、itervalues、iteritems、getitemcontains)。此外,还有一个 resolve() 方法不会因 KeyError 而失败,但会返回一个 Undefined 对象缺少变量。”

于 2013-08-05T17:17:40.207 回答