选择性覆盖 Jinja2

Selective Override Jinja2

{% block very_outer_block %}
    {%block outer_block%}
        <p> "howdy wassup up" </p>
        <p>{% block inner_block%}  "I want to be overridden"  {%endblock%}</p>
    {%endblock%}
{%endblock%}

是否可以在 outer_block 上调用 super() 但覆盖 inner_block

这样,如果 inner_block 被覆盖为 "Im another text",输出将是例如:

<p> "howdy wassup" </p>
<p> "Im another text" </p>

或者如果我们将 inner_block 覆盖为 "Overridden yet again"
所以它将是:

<p> "howdy wassup" </p>
<p> "Overridden yet again" </p>

我的问题是,如果我们在块中定义块,我们可以在 outer_block 上调用 super() 而覆盖 inner_block 吗?

你可以像这样覆盖内部块;该块是否嵌套在其他块中并不重要。只要你不覆盖那些(如果你不重新定义它们会使内部块不存在),它就可以正常工作:

>>> base = '''
{% block very_outer_block %}
    {%block outer_block%}
        <p> "howdy wassup up" </p>
        <p>{% block inner_block%}  "I want to be overridden"  {%endblock%}</p>
    {%endblock%}
{%endblock%}
'''
>>> test = '''
{% extends 'base' %}
{% block inner_block %}Overriding inner only{% endblock %}
'''
>>> env = jinja2.Environment(loader=jinja2.DictLoader({ 'base': base, 'test': test }))
>>> print(env.get_template('test').render().strip('\n'))

        <p> "howdy wassup up" </p>
        <p>Overriding inner only</p>