【问题标题】:jinja2: macro selecting macro or dynamic macro callsjinja2:宏选择宏或动态宏调用
【发布时间】:2012-12-10 13:57:03
【问题描述】:

我有一个我正在经历的命名元组列表,每个在渲染要求上都略有不同,所以我想根据一个属性调用正确的宏。我有的是这样的:

{% macro format_item(item) %}
    {% if item.type_of == 'a' %}
        {{ format_a(item) }}
    {% elif item.type_of == 'b' %}
        {{ format_b(item) }}
    {% elif item.type_of == 'c'%}
        {{ format_c(item) }}
    {% elif item.type_of == 'd'%}
        {{ format_d(item) }}
    {% else %}
        {{ format_general(item) }}
    {% endif %}
{% endmacro %}

但我想要的是这样的:

...iterating through list of items
{{ call macro based off item.type_of }}

此时在常规 python 中我会做类似的事情

getattr(object_with_method_to_produce_templates, item)

但还没有找到有效使用 attr 过滤器的方法(如果我可以在这种情况下正确使用它的话)。

我发现 flask.get_template_attribute 在其他地方寻找可能会很有趣(如果我可以提前完成所有操作并将预先计算和预先格式化的项目发送到模板)。也许太多了,超出了我此时想做的事情。

从各种宏列表中调用而不是从将来可能会变得相当大的 if then 列表中调用的更好方法是什么?似乎是一个常见问题,但我并没有偶然发现我正在寻找的确切答案。

编辑:

我将这个添加到我正在做的事情中,试图生成一个可调用宏作为我要渲染的项目的一部分

from flask import get_template_attribute
from jinja2 import Template
test_template = Template('{% macro test_macro(item) %}<div id="test-div">sent to me: {{ item }}</div>{% endmacro %}')

...在项目生成中...

 template = get_template_attribute(test_template, 'test_macro')

...在模板中...迭代项目然后为每个项目

{{ item.template("testing this method") }}

哪种方法有效,但只为字母生成字符串字母,而不是像常规宏那样(即 div 不呈现为 div,仅呈现为文本)。

<div id="test-div">sent to me: testing this method</div>

所以我需要给 Template 一些上下文,或者一些更接近目标但看起来不正确的东西。

EDIT2:

{{ item.template("testing this method")|safe }}

返回我正在寻找的东西,所以这是可以通过的,我可能能够绕过我拥有的 namedtuple 安排,只需传递一个宏,我想……还有更多工作要做。这是最佳/优选还是一团糟?

【问题讨论】:

  • 查看 Jinja 文档和安全过滤器中的 HTML 转义。
  • 好的,我已经查看了它们,但没有建立我需要建立的确切联系。我认为我所做的是将宏创建为代码块,但没有将其标记为 html(如文​​件扩展名所示),因此宏只是被重新呈现为纯文本,嗯,让我们稍微讨论一下.

标签: python templates jinja2


【解决方案1】:

您可以创建一个 Jinja2 过滤器,它从当前上下文中获取宏,然后评估宏。过滤器是:

@contextfilter
def call_macro_by_name(context, macro_name, *args, **kwargs):
    return context.vars[macro_name](*args, **kwargs)

查看完整答案here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2015-06-24
    • 2012-07-04
    • 1970-01-01
    相关资源
    最近更新 更多