【问题标题】:Jinja templates, how to do an import of all macros to follow the DRY principle?Jinja 模板,如何导入所有宏以遵循 DRY 原则?
【发布时间】:2017-07-22 00:32:01
【问题描述】:

目前我在很多地方都有:

{% from "macros/render_product_materials.html" import render_product_materials %}
{% from "macros/render_citation.html" import render_citation %}
{% from "macros/render_product_packages.html" import render_product_packages %}
{% from "macros/render_icon_explanation_section.html" import render_icon_explanation_section %}
{% from "macros/render_percentage_items.html" import render_percentage_items %}

这个列表还在继续!

然后我调用模板中的代码:

{{render_percentage_items('some args',2,34,55)}}

如果我改变一个函数名,我必须到处改变它,如果我添加一个新函数,我必须每次都去导入它

我宁愿只是想这样做,像这样:

{% include 'macros/all_macros.html' %}

然后我将所有导入都放入all_macros.html

但是:导入在上下文中不可用

例如

{% include 'macros/all_macros.html' %}

{{render_percentage_items('some args',2,34,55)}}

不起作用。 render_percentage_items 未找到。现在 jinja 的方法是什么?

【问题讨论】:

  • 我不确定,但您可以尝试 - {% import 'macros/all_macros.html' as all_macro with context %} 然后尝试 {{all_macro.render_percentage_items('some args',2,34, 55)}}
  • 这将在执行内部宏的 `{% set .. %}` 时起作用,例如{% set render_percentage_items = render_percentage_items %}

标签: macros jinja2


【解决方案1】:

将相关的宏收集到一个文件中是一个开始。然后使用import … as 而不是include

{% import 'macros/all_macros.html' as m %}
{{ m.render_percentage_items('some args', 2, 34, 55) }}

所以,基本上,正是 SumanKalyan 已经说过的。

在许多(大多数?)情况下,您甚至不需要with context,但您可以参考here 来决定是否需要。如文档中所述,with context 禁用缓存,并且通常imported 模板无论如何都只包含宏,它们可以而且应该被缓存。

Reference.

【讨论】:

    猜你喜欢
    • 2017-03-18
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    相关资源
    最近更新 更多