2009-07-24 58 views
15
<html> 
    <head> 
     <title>{% block title %}{% endblock %}</title> 
    </head> 

    <body> 
     <h1>{% block title %}{% endblock %}</h1> 
    </body> 
</html> 

這是我的模板,或多或少。 h1標題始終與標題標籤相同。以上代碼片段無效,因爲不能有兩個具有相同名稱的塊。我如何處理這個問題而不重複自己?在django模板中複製數據的最佳方式是什麼?


編輯澄清:我有一噸重的子模板,從這個一個模板繼承,因此使得新的{{title}}變量爲每個模板並不是一個很好的解決方案。以前我有它成立這樣的:

base.html文件:

<title>{% block title %}{% endblock %}</title> 

然後base_view.html(擴展base.html文件):

<h1>{% block title %}{% endblock %}</h1> 

然後base_object.html(擴大base_view.html):

{% block title %}my title goes here{% endblock %} 

它只是以某種方式工作。我重構了我的模板,因此只有base.html和base_object.html如何獲得此功能?

回答

8

它看起來像你的佈局是堅實的。您有一個base.html模板,用於定義應用中每個頁面的基本結構和外部佈局。您還有擴展此模板的base_object.html

你希望每個頁面都有一個唯一的標題和匹配的h1(我認爲)。這樣做的最好方法是在base.html模板中定義兩個獨立的塊。

<html> 
    <head> 
     <title>{% block title %}Default Title{% endblock %}</title> 
    </head> 

    <body> 
     <h1>{% block h1 %}{% endblock %}</h1> 
    </body> 
</html> 

在您的子模板中,如果您希望它們相同,則需要覆蓋這兩個模板。我知道你覺得這是違反直覺的,但是由於在Django中處理模板繼承的方式,這是非常必要的。

來源:The Django template language

最後要注意,你不能定義多個{% block %}標籤在同一個模板相同的名稱。這種限制的存在是因爲塊標籤在「兩個」方向上工作。也就是說,塊標籤不僅提供了一個要填充的洞 - 它還定義填充父項中的洞的內容。如果在模板中有兩個名稱相似的{% block %}標記,則該模板的父級將不知道要使用哪個塊的內容。

的孩子是這樣的:

{% extends "base.html" %} 
{% block title %}Title{% endblock %} 
{% block h1 %}Title{% endblock %} 

如果這困擾你,你應該從每一個對象作爲模板變量視圖設置標題。

{% block title %}{{ title }}{% endblock %} 
{% block h1 %}{{ title }}{% endblock %} 

Django努力保持模板層儘可能多的邏輯。通常標題是從數據庫動態確定的,所以視圖層是檢索和設置這些信息的理想場所。您仍然可以留下標題空白,如果你想推遲到默認標題(也許在base.html設置,或者可以從django.contrib.sites包搶站點的名稱)

而且{{ block.super }}可能會派上用場。這將允許您將父塊的內容與孩子的其他內容組合在一起。所以,你可以在孩子這樣定義的基礎「Stackoverflow.com」標題,並設置

{% block title %}{{ block.super }} - Ask a Question{% endblock %} 

得到象一本名爲「Stackoverflow.com - 提問」

1

將一個變量傳遞給您的模板,也許稱爲標題。然後用{{title}}替換您的標題欄。通入在您看來您的模板此請確保您有:

def myview(request): 
    t = loader.get_template("mypage.html") 
    title = "My Title" 
    c = Context({"title" : title }) 
    HttpResponse(t.render(c)) 

然後在你的模板,你將有:

<html> 
<head> 
    <title>{{ title }}</title> 
</head> 

<body> 
    <h1>{{ title }}}</h1> 
</body> 

參見:How to repeat a "block" in a django template

+0

這不是應該如何使用Django。 – 2009-07-24 16:57:13

+0

@Frank Crook:小心解釋? – 2009-07-24 17:00:57

8
{% extends "base.html" %} 

{% with "Entry Title" as title %} 
    {% block title %}{{ title }}{% endblock %} 
    {% block h1 %}{{ title }}{% endblock %} 
{% endwith %} 

那可以工作,如果你真的擔心保持title的意見,而不是重複自己。

20

在base.html文件:

<head> 
    <title>{% block title %}{% endblock %}</title> 
</head> 

<body> 
    <h1>{% block h1 %}{% endblock %}</h1> 
</body> 

然後,就那個叫content_base.html的頂部(或東西)另一個 「基地」 層:

{% extends "base.html" %} 

{% block h1 %}{% block title %}{% endblock %}{% endblock %} 

現在有你的所有其他模板擴展content_base.html。無論您在所有模板中放入「標題」,都會在base.html中的「標題」和「h1」塊中放入。

相關問題