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

Pic*_*els 2 django templates

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

base.html文件:

这是具有主要布局的模板.

<html>

  ...

  {% block content %}

  {% endblock %}

  ...

</html>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我有几个原因要问这个:

  1. 无需更改内容块的名称即可轻松更改页面的父级.
  2. 我不需要为我的积木提供名字.像内容内容,侧边栏内容等

我有两个解决方案,我不喜欢,因为他们不干:

  1. 使侧边栏成为局部,并将其包含在您需要的模板中.
  2. 将所有内容添加到基本模板并覆盖您不需要的块.

如果使用Django模板无法实现这一点,我可以使用其他模板引擎执行此类操作吗?

小更新:

模板图

所以我想要做的是能够在模板树中移动模板而不会有太多麻烦.虽然没有为我的内容块提供智能名称,但这是不可能的,但我想我还是添加了这个漂亮的图表.

Mik*_*one 6

不,你不能.从关于模板继承Django文档:

您无法{% block %}在同一模板中定义多个具有相同名称的标签.存在这种限制是因为块标签在"两个"方向上工作.也就是说,块标记不仅提供填充孔 - 它还定义填充父级孔的内容.如果{% block %}模板中有两个类似命名的标记,则该模板的父级将不知道要使用哪个块的内容.

我不清楚你为什么要这样做.

无需更改内容块的名称即可轻松更改页面的父级.

只有一个{% block %}带有给定名称的标签,并且只有一个{% extends %}标签.我没有看到任何困难.

我不需要为我的积木提供名字.像内容内容,侧边栏内容等

任何维护代码的人都会很快忘记哪个content块有效并且感到困惑.此外,名称应该与{% 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>
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

那么你的页面看起来就像你的例子那样:

plain_old_page.html:

{% extends base.html %}

{% block content %}
    <!-- content goes here -->
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)