我有一个基本模板,其中包含默认<head>
内容的块。在头部区域内,有<title>
的块。
例如,在基本文件中我会:
<head>
{% block head %}
{% block title %}<title>An App</title>{% endblock title %}
<script src="somescript.js"></script>
{% endblock head %}
</head>
在子模板中,我想从基础中包含头块中的所有内容(通过调用{{ super()) }}
并包含一些其他内容,但同时替换超级调用中的标题块
有没有一种方法可以做到这一点,而不只是围绕其他头部内容(不包括标题)放置一个块,只是替换所有这些?
答案 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 %}