如何在jinja2中重新定义宏

Rob*_*mba 4 python jinja2

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

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

我正在扩展这个模板在theme2{%- extends "theme1/layout.html" -%}

如何post_metatheme2中重新定义?简单地post_metatheme2中添加新定义不起作用.

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

{{ type(metadata) }}
Run Code Online (Sandbox Code Playgroud)

vos*_*usa 5

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

{% block pm_mac %}
    {% if use_child %}
        {%- macro post_meta(metadata) -%}
               .....
        {%- endmacro -%}
    {% else %}        
        {{ super() }}
    {% endif %} 
{% endblock %} 
Run Code Online (Sandbox Code Playgroud)

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") }}   
Run Code Online (Sandbox Code Playgroud)