看起来您的布局是可靠的。您有一个base.html
模板,用于定义应用程序中每个页面的基本结构和外部布局。您还可以base_object.html
扩展此模板。
您希望每个页面都有一个唯一的标题和一个匹配的h1(我认为)。最好的方法是在base.html模板中定义两个单独的块。
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<h1>{% block h1 %}{% endblock %}</h1>
</body>
</html>
在子模板中,如果希望它们相同,则需要覆盖这两个模板。我知道您认为这是违反直觉的,但是由于在Django中处理模板继承的方式,因此这是必须的。
来源:Django模板语言
最后,请注意,您不能{% block %}
在同一模板中定义多个具有相同名称的标签。存在此限制的原因是,块标签在“两个”方向上均起作用。也就是说,block标签不仅提供填充孔,还定义了填充父级孔的内容。如果{% block %}
模板中有两个名称相似的标签,则该模板的父级将不知道要使用哪个块内容。
孩子们看起来像这样:
{% extends "base.html" %}
{% block title %}Title{% endblock %}
{% block h1 %}Title{% endblock %}
如果这让您感到困扰,则应将每个对象的视图标题设置为模板变量。
{% block title %}{{ title }}{% endblock %}
{% block h1 %}{{ title }}{% endblock %}
Django努力将更多的逻辑排除在模板层之外。通常,标题是从数据库动态确定的,因此视图层是检索和设置此信息的理想场所。如果您想使用默认标题,则仍可以保留标题为空白(也许在中设置base.html
,或者可以从django.contrib.sites
软件包中获取网站名称)
也{{ block.super }}
可能派上用场。这将允许您将父块的内容与子项的其他内容组合在一起。因此,您可以在基础中定义一个标题,例如“Stackoverflow.com”,然后进行设置
{% block title %}{{ block.super }} - Ask a Question{% endblock %}
在孩子中获得诸如“ Stackoverflow.com-提问”之类的标题