替换{{super()}}中的块

时间:2014-01-21 19:46:19

标签: python templates jinja2

我有一个基本模板,其中包含默认<head>内容的块。在头部区域内,有<title>的块。

例如,在基本文件中我会:

<head>
    {% block head %}
    {% block title %}<title>An App</title>{% endblock title %}
    <script src="somescript.js"></script>
    {% endblock head %}
</head>

在子模板中,我想从基础中包含头块中的所有内容(通过调用{{ super()) }}并包含一些其他内容,但同时替换超级调用中的标题块

有没有一种方法可以做到这一点,而不只是围绕其他头部内容(不包括标题)放置一个块,只是替换所有这些?

1 个答案:

答案 0 :(得分:9)

请勿致电super。在您的子模板中,您可以执行以下操作:

{% extends "base.html" %}
{% block title %}<title>This is my new TITLE</title>{% endblock %}

Jinja用子节点中定义的块替换父节点中的所有块,如果不提供新定义,它将使用父节点中的定义。所以它将呈现为:

<head>

    <title>TITLE</title>
    <script src="somescript.js"></script>

</head>

如果您想要父级中块的默认值,请调用super

{% extends "base.html" %}
{% block title %}<title>TITLE</title>{{ super() }}{% endblock %}

这就是:

<head>

    <title>TITLE</title><title>An App</title>
    <script src="somescript.js"></script>

</head>

如果您想添加更多脚本,只需在基本模板中创建一个占位符块:

<head>
    {% block head %}
    {% block title %}<title>An App</title>{% endblock title %}
    <script src="somescript.js"></script>
    {% block moreScripts %}{% endblock moreScripts %}
    {% endblock head %}
</head>

并按照以下方式使用它:

{% extends "base.html" %}
{% block title %}<title>TITLE</title>{% endblock %}
{% block moreScripts %}
<script src="somescript1.js"></script>
<script src="somescript2.js"></script>
<script src="somescript3.js"></script>
{% endblock moreScripts %}