Django中模版的子目录与include标签的使用方法
get_template()中使用子目录
把所有的模板都存放在一个目录下可能会让事情变得难以掌控。你可能会考虑把模板存放在你模板目录的子目录中,这非常好。事实上,我们推荐这样做;一些Django的高级特性(例如将在第十一章讲到的通用视图系统)的缺省约定就是期望使用这种模板布局。
把模板存放于模板目录的子目录中是件很轻松的事情。只需在调用get_template()时,把子目录名和一条斜杠添加到模板名称之前,如:
t=get_template('dateapp/current_datetime.html')
由于render_to_response()只是对get_template()的简单封装,你可以对render_to_response()的第一个参数做相同处理。
returnrender_to_response('dateapp/current_datetime.html',{'current_date':now})
对子目录树的深度没有限制,你想要多少层都可以。只要你喜欢,用多少层的子目录都无所谓。
注意
Windows用户必须使用斜杠而不是反斜杠。get_template()假定的是Unix风格的文件名符号约定。
include模板标签
在讲解了模板加载机制之后,我们再介绍一个利用该机制的内建模板标签:{%include%}。该标签允许在(模板中)包含其它的模板的内容。标签的参数是所要包含的模板名称,可以是一个变量,也可以是用单/双引号硬编码的字符串。每当在多个模板中出现相同的代码时,就应该考虑是否要使用{%include%}来减少重复。
下面这两个例子都包含了nav.html模板。这两个例子是等价的,它们证明单/双引号都是允许的。
{%include'nav.html'%} {%include"nav.html"%}
下面的例子包含了includes/nav.html模板的内容:
{%include'includes/nav.html'%}
下面的例子包含了以变量template_name的值为名称的模板内容:
{%includetemplate_name%}
和在get_template()中一样,对模板的文件名进行判断时会在所调取的模板名称之前加上来自TEMPLATE_DIRS的模板目录。
所包含的模板执行时的context和包含它们的模板是一样的。举例说,考虑下面两个模板文件:
#mypage.html <html> <body> {%include"includes/nav.html"%} <h1>{{title}}</h1> </body> </html> #includes/nav.html <divid="nav"> Youarein:{{current_section}} </div>
如果你用一个包含current_section的上下文去渲染mypage.html这个模板文件,这个变量将存在于它所包含(include)的模板里,就像你想象的那样。
如果{%include%}标签指定的模板没找到,Django将会在下面两个处理方法中选择一个:
- 如果DEBUG设置为True,你将会在Django错误信息页面看到TemplateDoesNotExist异常。
- 如果DEBUG设置为False,该标签不会引发错误信息,在标签位置不显示任何东西。