2012-01-03 101 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