2014-10-27 46 views
4

比方說,我有此模板的宏(這是簡化的):重新定義進口神社宏

{# 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沒有在這種情況下無效,我真的不知道爲什麼。

我可以通過另一個導入以某種方式覆蓋在jinja中的導入的宏嗎?

回答

5

所以在我的同事的幫助下,我找到了答案。

父模板孩子一個
http://jinja.pocoo.org/docs/dev/faq/#my-macros-are-overridden-by-something

,如果你想使用第二個選項,你只需要檢查宏在父模板存在,這意味着後評估。

是這樣工作的:

{# macros.html #} 
{% if not a %} 
{% macro a(opts = {}) %} 
    {{ opts.a }} 
{% endmacro %} 
{% endif %} 

{% if not b %} 
{% macro b(opts = {}) %} 
    {{ opts.b }} 
{% endmacro %} 
{% endif %} 

而這其中包含了覆蓋

{# macros_override.html #} 
{% extends 'macros.html' %} 
{% if not a %}{# I repeat here in case there's gonna be a double extend #} 
{% macro a(opts = {}) %} 
    Overridden: {{ opts.a }} 
{% endmacro %} 
{% endif %} 

和剛剛導入這樣

{# template.html #} 
{% import 'macros_override.html' as macros %} 

{{ macros.a({ 'a': 'foo' }) }} 
{{ macros.b({ 'b': 'bar' }) }} 

,並將其輸出如預期

Overridden: foo 
bar