不,你不能。來自Django docs on template inheritance:
您無法在同一個模板中定義具有相同名稱的多個{% block %}
標記。這種限制的存在是因爲塊標籤在「兩個」方向上工作。也就是說,塊標記不僅僅提供了一個要填充的洞 - 它還定義填充父項中的洞的內容。如果在模板中有兩個名稱相似的{% block %}
標記,則該模板的父級將不知道要使用哪個塊的內容。
我不清楚你爲什麼要這樣做。
很容易更改頁面的父級,而不必更改內容塊的名稱。
只有一個{% block %}
標記具有給定的名稱,並且只有一個{% extends %}
標記。我沒有看到任何困難。
我不必爲自己的街區想出名字。像內容內容,邊欄內容等
任何維護您的代碼的人都會很快失去跟蹤哪些content
塊有效並且感到困惑。此外,這些名字應該與{% block %}
應該做的事有關。所以我想知道爲什麼你會有兩個模板,一個包含另一個模板,其模塊完全相同。
從docs還有一點:
如果你發現自己在許多模板複製內容,這可能意味着你應該將在父模板內容到{%塊%}。
這可讓您將重複標記設置爲默認值,並且可以在需要的地方覆蓋它。
這可能是有幫助的,太:
如果你需要得到該塊的父模板的內容,該{{ block.super }}
變量會做的伎倆。如果你想添加父塊的內容而不是完全覆蓋父塊的內容,這很有用。使用{{ block.super }}
插入的數據將不會自動轉義(請參閱下一節),因爲它已經在父模板中被轉義(如有必要)。
從我可以告訴,這可能是你最好的選擇:
讓側邊欄的部分,包括它在您需要的模板。
這是不是DRY?你必須重複{% 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 %}
你能解釋一下爲什麼你認爲這是一個壞理念? – Pickels
Mike在 – kieran