Django:具有相同名称的嵌套内容块
有没有办法让内容块具有相同的名称 base.html: 这是带有主布局的模板Django:具有相同名称的嵌套内容块,django,templates,Django,Templates,有没有办法让内容块具有相同的名称 base.html: 这是带有主布局的模板 <html> ... {% block content %} {% endblock %} ... </html> ... {%block content%} {%endblock%} ... base\u side\u left.html: 这是主布局+侧边栏位于左侧的模板 {% extends 'base.html' %} {% block content
<html>
...
{% block content %}
{% endblock %}
...
</html>
...
{%block content%}
{%endblock%}
...
base\u side\u 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
{%extends'base.html%}
{%block content%}
{%block content%}
//这不起作用,因为不能有同名的块//
{%endblock%}
{%endblock
我问这个问题有几个原因:
{%block%}
标记。存在此限制是因为块标记在“两个”方向上工作。也就是说,块标记不仅提供要填充的孔,还定义填充父级孔的内容。如果有两个同名的{%block%}
标记在模板中,该模板的父级不知道使用哪个块的内容
我不清楚你为什么要这样做
更改页面的父级很容易,无需更改内容块的名称
只有一个具有给定名称的{%block%}
标记,也只有一个{%extends%}
标记。我看不出有任何难度上的差异
我不必为我的块命名。比如内容、边栏内容等等
任何维护您的代码的人都会很快忘记哪个内容
块是有效的,并且会感到困惑。此外,名称应该与{%block%}
应该做什么有关。所以我想知道为什么您会有两个模板,一个包括另一个,其中的块完全相同
另一点是:
如果您发现自己在多个模板中复制内容,这可能意味着您应该将该内容移动到父模板中的{%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>
然后,按照示例的顺序,您的页面看起来就像:
plain_old_page.html:
{% extends base.html %}
{% block content %}
<!-- content goes here -->
{% endblock %}
{%extends base.html%}
{%block content%}
{%endblock%}
带有左侧边栏的页面。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 %}
{% 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 %}
{%extends base.html%}
{%block page_class%}带有侧边栏{%endblock%}
{%块边栏%}
{%endblock%}
{%block content%}
{%endblock%}
带有左侧栏和横幅的页面:
{% 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 %}
{%extends base.html%}
{%block page_class%}带有带有标题的侧栏{%endblock%}
{%块边栏%}
{%endblock%}
{%block banner%}
{%endblock%}
{%block content%}
{%endblock%}
带有右侧栏的页面。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 %}
{% 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 %}
{%extends base.html%}
{%block page_class%}右侧{%endblock%}
{%块边栏%}
{%endblock%}
{%block content%}
{%endblock%}
你能解释一下为什么你认为这是个坏主意吗?Mike在下面介绍了我的大部分理由,比如我问了一些奇怪的问题。我在IRC上也有类似的反应。我在其他语言中使用了这种技术,模板确实支持同名嵌套块,我认为它工作得非常好。我不认为其他人维护它是一种错误大问题。他们只需要按照扩展一直到基础模板。include标记不是这样干的,因为我必须重复它。对于侧栏来说,这是可行的,但是如果你有其他共享部分呢。无论如何,我这里的空间有限,所以我将使用剩余的空间感谢你花时间回答:谢谢:)你可以始终编辑问题以提供更多细节。没有空间限制。如果我知道你想做什么,我仍然认为有更好的方法来做你想做的事情。更新了一点问题,但我认为你的答案已经告诉我这不可能是我想要的方式。