如何在jinja2中重新定义宏

时间:2012-12-11 12:54:54

标签: python jinja2

我正在通过sphinx使用jinja2。在我的基本模板中( layout.html 我有一些宏

{%- macro post_meta(metadata) -%}
    <div class="postmeta">
        {{ author(metadata.author) }}
    </div>
{%- endmacro -%}

我正在使用{%- extends "theme1/layout.html" -%}

theme2 中扩展此模板

如何在 theme2 中重新定义post_meta?简单地将post_meta的新定义放在 theme2 中是行不通的。

顺便说一下我怎样才能使用python buildin函数:

{{ type(metadata) }}

1 个答案:

答案 0 :(得分:5)

Q1:你必须创建一个块来覆盖基础模板中宏的块。这是孩子的代码。使用use_child = False:将使用基本模板中的宏

{% block pm_mac %}
    {% if use_child %}
        {%- macro post_meta(metadata) -%}
               .....
        {%- endmacro -%}
    {% else %}        
        {{ super() }}
    {% endif %} 
{% endblock %} 

Q2:您必须注册一个全局Python函数才能使用类型:

def py_to_upper(a):
    return a.upper()

env.globals['to_upper'] = py_to_upper # register the global python function


and in the Jinja template :

{{ to_upper("lowercase") }}