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

gol*_*enk 2 python templates jinja2

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

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

<head>
    {% block head %}
    {% block title %}<title>An App</title>{% endblock title %}
    <script src="somescript.js"></script>
    {% endblock head %}
</head>
Run Code Online (Sandbox Code Playgroud)

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

有没有办法做到这一点,而不只是围绕头部内容的其余部分(不包括标题),并只是替换所有这些?

Alv*_*tes 11

不要打电话super.在您的孩子模板中,您可以:

{% extends "base.html" %}
{% block title %}<title>This is my new TITLE</title>{% endblock %}
Run Code Online (Sandbox Code Playgroud)

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

<head>

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

</head>
Run Code Online (Sandbox Code Playgroud)

super如果要在父级中使用块的默认值,则调用:

{% extends "base.html" %}
{% block title %}<title>TITLE</title>{{ super() }}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

这呈现为:

<head>

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

</head>
Run Code Online (Sandbox Code Playgroud)

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

<head>
    {% block head %}
    {% block title %}<title>An App</title>{% endblock title %}
    <script src="somescript.js"></script>
    {% block moreScripts %}{% endblock moreScripts %}
    {% endblock head %}
</head>
Run Code Online (Sandbox Code Playgroud)

并使用它如:

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