2011-06-21 65 views
2

有沒有辦法讓內容塊具有相同的名稱?Django:具有相同名稱的嵌套內容塊

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 

我爲什麼我問這幾個原因:

  1. 可以很容易地更改頁面的父,而無需更改內容塊的名稱。
  2. 我不必爲我的街區想出名字。像內容的內容,側邊欄的內容,等

我得到了這個,我不喜歡兩種解決方案,因爲他們是不會幹:

  1. 讓側邊欄的部分,並將其納入你需要的模板。
  2. 將所有內容添加到基本模板並覆蓋不需要的塊。

如果這是不可能與Django模板我可以做這樣的事情與其他模板引擎?

小更新:

template diagram

所以我想要做的是能夠在模板樹四處移動模板,而無需到太多的麻煩。這是不可能的,雖然沒有爲我的內容塊提出聰明的名字,但我想我反正添加了這個漂亮的圖。

+0

你能解釋一下爲什麼你認爲這是一個壞理念? – Pickels

+0

Mike在 – kieran

回答

6

不,你不能。來自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 %} 
+1

以下覆蓋了我的大部分理由好像我在問一些奇怪的事情。我對IRC有類似的反應。我在其他語言中使用這種技術,其中模板支持具有相同名稱的嵌套塊,我認爲它的工作非常好。我不認爲其他人維護它是一個大問題。他們只需遵循延伸到基本模板的方式。包含標籤不是幹這種方式,因爲我不得不重複它。對於一個側邊欄它是可行的,但如果你有其他共享的部分。無論如何,我在這裏有限的空間,所以我會用剩下的空間感謝您花時間回答:謝謝:) – Pickels

+1

您可以隨時編輯問題以提供更多細節。那裏沒有空間限制。我仍然認爲有一個更好的方法來完成你想做的事情,*如果我有一些想法你想做什麼。* –

+0

更新了一些問題,但我認爲你的答案已經告訴我,這是不可能的,我想要的。 – Pickels

相關問題