【问题标题】:How to get a list of current variables from Jinja 2 template?如何从 Jinja 2 模板获取当前变量列表?
【发布时间】:2010-08-03 17:02:46
【问题描述】:

如果我像这样返回 Jinja2 模板: return render_response('home.htm', **context)

然后如何从模板中获取上下文中的变量列表?

【问题讨论】:

  • 阅读模板源码怎么样?这有什么问题?

标签: templates jinja2


【解决方案1】:

从技术上讲,因为上下文不是作为命名字典传递的,所以需要做一些工作来从模板内部生成上下文变量的列表。不过有可能。

  1. 定义一个Jinja context function来返回jinja2.Context对象,它本质上是一个全局变量/函数的字典

  2. 使该函数在全局命名空间中可用;即 jinja2.Environment 或 jinja2.Template 全局字典

  3. (可选)从上下文中过滤对象;例如,使用callable() 跳过 Jinja 的默认全局辅助函数(范围、连接器等)。这可以在上下文函数或模板中完成;最有意义的地方。

例子:

>>> import jinja2
>>> 
>>> @jinja2.contextfunction
... def get_context(c):
...         return c
... 
>>> tmpl = """ 
... {% for key, value in context().items() %}
...     {% if not callable(value) %}
...         {{ key }}:{{ value }}
...     {% endif %}
... {% endfor %}
... """
>>> 
>>> template = jinja2.Template(tmpl)
>>> template.globals['context'] = get_context
>>> template.globals['callable'] = callable
>>>
>>> context = {'a': 1, 'b': 2, 'c': 3}
>>> 
>>> print(template.render(**context))
        a:1
        c:3
        b:2

[或者,使用('home.htm', context=context) 调用render_response 以使其他解决方案起作用。]

【讨论】:

  • 请注意,由于callable 检查,您的解决方案将忽略已作为上下文的一部分显式传递的函数。可能不会经常发生,但可能会有所作为。
  • 是的。这个简单的解决方案绝对可以改进。例如,如果template 是一个全局的,get_context() 可以返回一个基于context 但没有template.globals 中也存在的键的新字典。
  • 添加功能请求以默认启用此功能github.com/mitsuhiko/jinja2/issues/174
  • @techtonik 有什么消息吗?我正是为此而苦苦挣扎
  • @Strajk,我问过 Armin,但不确定他是否有时间看。对我来说,带有屏幕截图的拉取请求比一些代码片段和一些漂浮的想法更有说服力。
【解决方案2】:

下面是如何让 @crewbum's answer 在 Flask 应用程序中工作:

import jinja2

@jinja2.contextfunction
def get_context(c):
    return c

app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable

【讨论】:

  • 你把这个放在哪里?
  • 在应用初始化(或应用工厂)中。如果您使用任何烧瓶扩展,如烧瓶-sqlalchemy、烧瓶-登录等,这可以与创建它们的位置相同。
【解决方案3】:

我发现@Garrett's answer 比我想要的要复杂一些。我发现我可以通过将上下文的克隆添加到上下文本身来轻松地检查上下文:

contextCopy = dict(context)
context['all'] = contextCopy

然后使用 <pre>{{ all|pprint }}</pre> 将其漂亮地打印到我的 Jinja 模板中。

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多