pri*_*stc 15 python django django-templates
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>{% block title %}{% endblock %}</h1>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是我的模板,或多或少.h1标题始终与标题标记相同.上面的代码片段无效,因为不能有两个具有相同名称的块.如何处理这个而不重复自己?
编辑澄清:我有大量的子模板继承自这一个模板,因此为每个模板创建一个新的{{title}}变量不是一个很好的解决方案.以前我把它设置成这样:
base.html文件:
<title>{% block title %}{% endblock %}</title>
Run Code Online (Sandbox Code Playgroud)
然后在base_view.html(扩展base.html):
<h1>{% block title %}{% endblock %}</h1>
Run Code Online (Sandbox Code Playgroud)
然后在base_object.html(扩展base_view.html):
{% block title %}my title goes here{% endblock %}
Run Code Online (Sandbox Code Playgroud)
它只是以某种方式工作.我重构了我的模板,所以只有base.html和base_object.html我怎样才能恢复这个功能?
小智 21
在base.html中:
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>{% block h1 %}{% endblock %}</h1>
</body>
Run Code Online (Sandbox Code Playgroud)
然后,在名为content_base.html(或其他)之上创建另一个"基础"图层:
{% extends "base.html" %}
{% block h1 %}{% block title %}{% endblock %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)
现在让您的所有其他模板扩展content_base.html.无论你在所有模板中的块"标题"中放置什么,都会进入base.html中的"title"和"h1"块.
Ste*_*osh 10
{% extends "base.html" %}
{% with "Entry Title" as title %}
{% block title %}{{ title }}{% endblock %}
{% block h1 %}{{ title }}{% endblock %}
{% endwith %}
Run Code Online (Sandbox Code Playgroud)
如果你真的担心不遵守title意见而不重复自己,这可能会奏效.
看起来你的布局很稳固.您有一个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>
Run Code Online (Sandbox Code Playgroud)
在您的子模板中,如果您希望它们相同,则需要覆盖这两个模板.我知道你觉得这是违反直觉的,但由于在Django中处理模板继承的方式,这是必要的.
来源:Django模板语言
最后,请注意,您无法
{% block %}在同一模板中定义多个具有相同名称的标记.存在这种限制是因为块标签在"两个"方向上工作.也就是说,块标记不仅提供填充孔 - 它还定义填充父级孔的内容.如果{% block %}模板中有两个类似命名的标记,则该模板的父级将不知道要使用哪个块的内容.
孩子们看起来像这样:
{% extends "base.html" %}
{% block title %}Title{% endblock %}
{% block h1 %}Title{% endblock %}
Run Code Online (Sandbox Code Playgroud)
如果这让您感到困扰,则应将每个对象的视图中的标题设置为模板变量.
{% block title %}{{ title }}{% endblock %}
{% block h1 %}{{ title }}{% endblock %}
Run Code Online (Sandbox Code Playgroud)
Django努力尽可能多地保留模板层之外的逻辑.通常,标题是从数据库动态确定的,因此视图层是检索和设置此信息的理想位置.如果您想要推迟默认标题(也许可以设置base.html,或者您可以从django.contrib.sites包中获取网站名称),您仍然可以将标题留空
也{{ block.super }}可能会派上用场.这将允许您将父块的内容与子项中的其他内容组合在一起.因此,您可以在基础中定义类似"Stackoverflow.com"的标题,然后进行设置
{% block title %}{{ block.super }} - Ask a Question{% endblock %}
Run Code Online (Sandbox Code Playgroud)
在孩子身上得到像"Stackoverflow.com - 提问"这样的标题
| 归档时间: |
|
| 查看次数: |
6226 次 |
| 最近记录: |