2013-01-17 24 views
1

Django初學者。我有一個帶有徽標的基本模板,以及三個內容小節。其中兩個小節默認包含html,剩下的小節用於每個子頁面的內容。Django html重用

我現在想創建一個不同的頁面,與完全相同的徽標,但有不同的小節/內容。例如我可能只需要兩個小節,水平格式而不是垂直格式等。

因此,爲此,我想我需要創建一個新模板 - 問題是我違反了DRY主體,因爲它具有完全相同的徽標html代碼作爲第一個模板的新模板。

那麼,在這種情況下,是否有任何設計模式可以解決重複徽標代碼的問題?我正在考慮將isPage1isPage2等變量傳遞給模板,然後基於此啓用/禁用塊 - 這是一種可行的方法,任何人都可以提供任何替代方法嗎?

非常感謝

回答

5

是的,有一種模式完全符合您的需求。在DJANGO中稱爲template inheritance

您將基本上有一個基本模板與您的標題,徽標和主要內容佔位符。喜歡的東西(從鏈接中提取我放在上面):

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <link rel="stylesheet" href="style.css" /> 
    <title>{% block title %}My amazing site{% endblock %}</title> 
</head> 

<body> 
    <div id="sidebar"> 
     {% block sidebar %} 
     <ul> 
      <li><a href="/">Home</a></li> 
      <li><a href="/blog/">Blog</a></li> 
     </ul> 
     {% endblock %} 
    </div> 

    <div id="content"> 
     {% block content %}{% endblock %} 
    </div> 
</body> 
</html> 

然後,您的實際網頁上(使用模板中的一個),你將有:

{% extends "base.html" %} 

{% block title %}My amazing blog{% endblock %} 

{% block content %} 
{% for entry in blog_entries %} 
    <h2>{{ entry.title }}</h2> 
    <p>{{ entry.body }}</p> 
{% endfor %} 
{% endblock %} 

注意,基本模板這裏叫做base.html。所以,在您的網頁延伸base.html通過放置{% extends "base.html" %}。然後,在該頁面中,您只需添加特定block的內容即可。

+0

這幾乎是我現在所在的位置 - 基本上我的基本模板包含許多用於整個網站的html,每個子頁面的內容中間有一個塊。我現在想要創建一個新頁面,它具有與base.html中相同的徽標,但中的結構不同。我怎樣才能做到這一點,而無需重複標識代碼? – Sherlock

+0

將徽標代碼放在與主內容不同的塊中,並且在擴展時不要覆蓋它。 –

+0

明白 - 我一直沒有正確使用模板系統!謝謝澄清。 – Sherlock

0
You can use this inheritance concept in different way. 
use same block tags to whole application 
filename: index.html 
<html> 
    <head> 
     ---style.css files here--- 
     {% block title %}title{% endblock %} 
     {% block additional_css_files %}css files{% endblock %} 
     {% block header %}header and header menus{% endblock %} 
    </head> 
    <body> 
     {% block main_content %} 
      your body content here 
     {% endblock %} 
     {% block scripts %}Script files{% endblock %} 
    </body> 
</html> 

filename: home.html 
{% extends "index.html" %} 
    {% block title %}title2{% endblock %}# u can overwrite the title with new title 
    but if you want to use parent title no need to mention block tags in home.html 
    or you have to use {% block title %}{{block.super}}{% endblock %} 

    same concept come below. 
    {% block additional_css_files %}css files2{% endblock %} 
    {% block header %}header and header menus{% endblock %}