假设我有这个带有宏的模板(这些是简化的):
{# macros.html #}
{% macro a(opts = {}) %}
{{ opts.a }}
{% endmacro %}
{% macro b(opts = {}) %}
{{ opts.b }}
{% endmacro %}
而这一个包含覆盖
{# macros_override.html #}
{% macro a(opts = {}) %}
Overridden: {{ opts.a }}
{% endmacro %}
然后我想在同一个命名空间下有一个包含所有这些宏的模板 macros
{# template.html #}
{% import 'macros.html' as macros %}
{% import 'macros_override.html' as macros %}
{{ macros.a({ 'a': 'foo' }) }}
{{ macros.b({ 'b': 'bar' }) }}
和我期望的输出:
Overridden: foo
bar
但 b
未定义 . 我试图将 macros_override.html
模板更改为:
{# macros_override.html #}
{% extends 'macros.html' %}
{% macro a(opts = {}) %}
Overridden: {{ opts.a }}
{% endmacro %}
然后只导入覆盖模板作为宏,但宏 a
isn 't overridden in this case and I don' t真的知道原因 .
我可以通过其他导入以某种方式覆盖jinja中的导入宏吗?
1 回答
所以在我的同事的帮助下,我明白了 .
这意味着如果你想使用第二个选项,你只需要在父模板中检查宏是否存在 .
像这样工作:
而这一个包含覆盖
并且就像这样导入它们
它按预期输出