Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:具有相同名称的嵌套内容块_Django_Templates - Fatal编程技术网

Django:具有相同名称的嵌套内容块

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

有没有办法让内容块具有相同的名称

base.html:

这是带有主布局的模板

<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
我问这个问题有几个原因:

  • 更改页面的父级很容易,无需更改内容块的名称
  • 我不必为我的块命名。比如内容、边栏内容等等
  • 我有两种解决方案,我不喜欢,因为它们不干燥:

  • 将侧边栏设置为部分,并将其包含在所需的模板中
  • 将所有内容添加到基础模板,并覆盖不需要的块
  • 如果Django模板无法实现这一点,我可以使用其他模板引擎执行类似操作吗

    小更新:

    因此,我想做的是能够在模板树中移动模板,而无需太多麻烦。如果不为我的内容块提供智能名称,这是不可能的,但我想我还是添加了这个漂亮的图表。

    不,你不能。从:

    不能在同一模板中定义多个同名的
    {%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标记不是这样干的,因为我必须重复它。对于侧栏来说,这是可行的,但是如果你有其他共享部分呢。无论如何,我这里的空间有限,所以我将使用剩余的空间感谢你花时间回答:谢谢:)你可以始终编辑问题以提供更多细节。没有空间限制。如果我知道你想做什么,我仍然认为有更好的方法来做你想做的事情。更新了一点问题,但我认为你的答案已经告诉我这不可能是我想要的方式。