有没有办法让内容块具有相同的名称?
base.html文件:
这是主要布局的模板。
<html>
...
{% block content %}
{% endblock %}
...
</html>
base_side_left.html:
这是左侧主要版面+侧边栏的模板。
{% extends 'base.html' %}
{% block content %}
<div class='sidebar'>
</div>
{% block content %}
//This doesn't work because you can't have blocks with the same name//
{% endblock %}
{% endblock
我有几个理由要问这个:
我得到了两个我不喜欢的解决方案,因为它们不是干的:
如果使用Django模板无法做到这一点,我可以使用其他模板引擎做这样的事情吗?
小更新:
所以我想做的是能够在模板树中移动模板而不会有太多麻烦。虽然没有为我的内容块提供智能名称,但这是不可能的,但我想我还是添加了这个漂亮的图表。
答案 0 :(得分:6)
您无法在同一模板中定义多个具有相同名称的
{% block %}
代码。存在这种限制是因为块标签在“两个”方向上工作。也就是说,块标记不仅提供填充孔 - 它还定义填充父中的孔的内容。如果模板中有两个同名的{% block %}
标记,则该模板的父级将不知道要使用哪个块的内容。
我不清楚你为什么要这样做。
无需更改内容块的名称即可轻松更改页面的父级。
只有一个{% block %}
标记具有给定名称,并且只有一个{% extends %}
标记。我没有看到任何困难。
我不需要为我的积木提供名字。像内容内容,侧边栏内容等
任何维护代码的人都会很快忘记哪个content
阻止有效并且感到困惑。此外,名称应该与{% block %}
应该做的事情有关。所以我想知道为什么你有两个模板,一个包括另一个,模块完全相同。
docs的另一点:
如果您发现自己在多个模板中复制了内容,则可能意味着您应该将该内容移动到父模板中的{%block%}。
这使您可以将复制的标记设置为默认值,并且可以在需要的位置覆盖它。
这也可能有所帮助:
如果您需要从父模板获取块的内容,
{{ block.super }}
变量将起作用。如果要添加到父块的内容而不是完全覆盖它,这将非常有用。使用{{ block.super }}
插入的数据不会自动转义(请参阅下一节),因为必要时,它已在父模板中转义。
据我所知,这可能是您的最佳选择:
使侧边栏部分显示,并将其包含在您需要的模板中。
这怎么不干?您必须重复{% include %}
代码?
我认为有一个更适合您的设计解决方案,但是您没有提供足够的信息来帮助我进一步提供帮助。
编辑:查看您的示例,您可以使用单个模板完成所有。 CSS会在这里照顾您。
page_template.html:
<!DOCTYPE html PUBLIC -- ... -->
<html>
<head>
<!-- ... other header fields ... -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<base href="{{ host }}{{ root }}{{ path }}" />
<title>{% block title %}Untitled{% endblock %}</title>
<link rel="icon" type="image/png"
href="{{ root }}static/images/favicon.png" />
<link rel="stylesheet" type="text/css"
href="{{ root }}static/css/general.css" />
<!-- other header fields here -->
{% block head %}{% endblock %}
</head>
<body class="{% block page_class %}no_sidebar{% endblock %}">
<div id="page_header">
<!-- page heading here -->
</div>
<div id="sidebar">
{% block sidebar %}<!-- default sidebar here -->{% endblock %}
</div>
<div id="banner">
{% block banner %}{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
general.css:
body.no_sidebar div#sidebar,
div#banner
{
display: none;
}
div#sidebar
{
width: 20%;
}
body.with_sidebar div#sidebar
{
float: left;
}
body.with_banner div#banner
{
display: block;
}
body.right_sidebar div#sidebar
{
float: right;
}
然后你的网页看起来就像你的例子一样:
plain_old_page.html:
{% extends base.html %}
{% block content %}
<!-- content goes here -->
{% endblock %}
page_with_left_sidebar.html:
{% extends base.html %}
{% block page_class %}with_sidebar{% endblock %}
{% block sidebar %}
<!-- sidebar goes here, if different from default -->
<!-- otherwise omit this section -->
{% endblock %}
{% block content %}
<!-- content goes here -->
{% endblock %}
page_with_left_sidebar_and_banner.html:
{% extends base.html %}
{% block page_class %}with_sidebar with_banner{% endblock %}
{% block sidebar %}
<!-- sidebar goes here, if different from default -->
<!-- otherwise omit this section -->
{% endblock %}
{% block banner %}
<!-- banner goes here -->
{% endblock %}
{% block content %}
<!-- content goes here -->
{% endblock %}
page_with_right_sidebar.html:
{% extends base.html %}
{% block page_class %}right_sidebar{% endblock %}
{% block sidebar %}
<!-- sidebar goes here, if different from default -->
<!-- otherwise omit this section -->
{% endblock %}
{% block content %}
<!-- content goes here -->
{% endblock %}