【问题标题】:How to get the list of arguments in a Jinja2 template [duplicate]如何获取 Jinja2 模板中的参数列表 [重复]
【发布时间】:2013-08-05 17:06:13
【问题描述】:

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

【问题讨论】:

  • 是的...我应该阅读文档。感谢您参与讨论。
  • @ZeroPiraeus 如果我使用 __call__() 方法将对象传递给模板,该解决方案似乎不起作用:我将继续调查(阅读 codegeek 链接的文档)

标签: python templates flask jinja2


【解决方案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()进入堆栈跟踪中的框架之一。您只需要启用调试模式即可使用它,只需记住在生产中将其关闭即可。

这是一个适合您的工作示例,它取自您在示例文件夹下下载的 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 条目,这是你想要的吗?

【讨论】:

  • 感谢您的回答,但我认为这更像是一种解决方法,而不是问题的真正答案。
  • 您到底需要什么?这实际上是一个有趣的问题。我已经稍微编辑了我的答案。
  • 我需要的是一种通用的方法来访问传递给模板的所有参数并对其进行一些检查。问题是我想在一个“布局”模板中执行此操作,该模板由不同视图中使用的实际模板扩展,所以我不知道哪种变量(对象实例、简单字符串或其他)已通过,也没有可能的名称。我希望它能让您对问题有所了解。
  • 啊哈!所以你需要一个调试模板之类的东西,这里有这样的东西:pypi.python.org/pypi/Flask-DebugToolbar
  • 嗯,类似的事情,但我需要做的不仅仅是查看变量。但我喜欢他们只提取变量并从上下文中排除模板过滤器和其他东西的方式。我会看看他们在代码中的表现!谢谢!
【解决方案2】:

看看jinja2.runtime.Context

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

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

【讨论】:

    猜你喜欢
    • 2013-01-20
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多