2012-01-03 102 views
24

假設我有下面顯示的三個html模板文件。 HTML只是爲了說明這一點。Django多級模板擴展和嵌套塊

是否有可能以某種方式將名爲extra_head_content的塊嵌入已命名爲extra_head_content的塊內。這個想法是讓第三層模板提供一個名爲extra_head_content的塊。它上面的模板獲取該內容,將其添加到名爲extra_head_content的塊中,並將此組合塊提供給其父模板。

本質上,我正在尋找跨越繼承的模板文件的塊嵌套。

我試圖解決的確切場景是任何模板都應該能夠向head元素添加額外的javascript或css文件。然而,最低的模板不應該關心它嵌套的層數。同樣,由中間模板提供的額外頭部內容不應被終端模板的塊元素覆蓋。

base.html文件

<html> 
<head> 
    <link rel="stylesheet" type="text/css" href="/static/css/reset.css" /> 
    {% block extra_head_content %}{% endblock %} 
</head> 
<body>{% block content %}{% endblock %} 
</html> 

account.html

{% extends "base.html" %} 

{% block extra_head_content %} 
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" /> 
    {% block extra_head_content %}{% endblock %} 
{% endblock %} 

{% block content %} 
    <div id="menu">...</div> 
    {% block account_content %}{% endblock %} 
{% endblock %} 

account_profile.html

{% extends "account.html" %} 

{% block extra_head_content %} 
    <link rel="stylesheet" type="text/css" href="/static/css/edit_profile.css" /> 
{% endblock %} 

{% block account_content %} 
    Welcome to your profile 
{% endblock %} 

回答

49

沒有,但你可以使用{{ block.super }}

{% block extra_head_content %} 
    {{ block.super }} 
    <link rel="stylesheet" type="text/css" href="/static/css/account.css" /> 
{% endblock %} 
2

django-sekizai模塊負責添加到CSS和JavaScript輕鬆:

#base.html 
{% load sekizai_tags %} 
# define your template, declaring blocks for inheriting templates: 
{% block content %} 
{% endblock content %} 
# at the bottom of the body: 
{% render_block "js" %} 
</body> 
</html> 

#my_template.html 
{% extends "base.html" %} 
{% load sekizai_tags %} 
{% block content %} 
# content goes here... 
# so does the addtoblock tag 
    {% addtoblock "js" %} 
     <script src="my/awesome/script.js"></script> 
    {% endaddtoblock %} 
{% endblock content %} 
# Note no addtoblock tags outside the block-endblock tags 

sekazai docs明確的告誡使用該系統,即:

  1. render_block只能在室外使用塊標記
  2. render_block不能用於包含的模板中
  3. addtoblock應在塊標記中用於包含的模板中
+1

django-sekizai是非常有用的......我找不到任何參考它現在與Django一起發貨了嗎? AFAICT它仍然是第三方模塊 – Anentropic 2015-05-24 10:46:07

+0

感謝您選擇了!它似乎包含在Django CMS 2.2及更高版本中,但目前還沒有包含Django本身,所以我已經更正了我的答案。 – 2015-05-25 12:07:31