il.html ('django' engine)
/home/html/default/story_detail.html ('django' engine)
/home/html/jinja2/story_detail.html ('jinja2' engine)
会先用第一个引擎,然后再使用第二个引擎的配置进行搜索,当找到第一个符合的文件时,就会停止搜索,也就是后面也有同名的文件的话,将会‘失明’。
另外,我们可以使用包括路径的名称,django也推荐这样做,最好的方法就是为每一个app建立一个同名的目录,然后在该目录下放置这个app要用到的模板,这样可以避免重名问题带来的模板查找错误,例如: get_template('news/story_detail.html')
- /home/html/example.com/news/story_detail.html ('django' engine)
- /home/html/default/news/story_detail.html ('django' engine)
- /home/html/jinja2/news/story_detail.html ('jinja2' engine)
dirs :该参数从1.8起被移除,这里不再讨论。
using:表示要使用哪个引擎进行查找,该参数接受的是模板引擎的 NAME ,详情参考上面的配置中的 NAME。默认为 None ,如上面的例子所示,为 None 时将使用两个引擎进行查找,两个引擎按配置的先后进行查找,如果指定了使用某个引擎,另一个引擎就不会再查找了。
2. select_template(template_name_list[, dirs][, using])
select_template() 和 get_template()很相似, 只不过它用了一个模板名称的列表作为参数。按顺序搜索模板名称列表内的模板并返回第一个存在的模板。
例如:如果你调用函数 select_template(['story_253_detail.html', 'story_detail.html']), Django按以下顺序查找:
- /home/html/example.com/story_253_detail.html ('django' engine)
- /home/html/default/story_253_detail.html ('django' engine)
- /home/html/jinja2/story_253_detail.html ('jinja2' engine)
- /home/html/example.com/story_detail.html ('django' engine)
- /home/html/default/story_detail.html ('django' engine)
- /home/html/jinja2/story_detail.html ('jinja2' engine)
其他的参数都是一样的,这里不重复说明。
你可以通过 select_template() 来实现更为灵活的模板加载。例如: select_template(['story_%s_detail.html' %story.id, 'story_detail.html'])的形式。
渲染
按照约定,查找到的模板,也就是调用上面两个搜索模板的函数后,将返回一个由后端模板引擎所定义的 Template 对象,该对象必须实现 render()方法,所以在自定义模板引擎的时候要要注意这一点。
Template.render(context=None, request=None)
context:它必须是一个python字典对象(dict),将用这个字典对模板进行渲染,如果没有提供,将使用一个空的字典。
request:它必须是一个 Httprequest 对象,后端引擎必须妥善处理它,同时还要处理 CSRF 令牌,当然如何实现是后端引擎做的事,也取决于不同的后端引擎。
render_to_string(template_name[, context][, context_instance][, request][, using])
也是位于 django.template.loader 中,用于将模板渲染后返回字符串。
template_name:模板名称,如果是一个字符串,将调用 get_template() 方法;如果是一个列表将调用 select_template() 方法。
context:一个python字典,用来渲染模板。
context_instance:从1.8版本起废弃,这里不再讨论。
request:必须是一个 HttpRequest 对象,并且在整个模版渲染期都是可用的。
using:用来指定查找模板的引擎。
快捷函数
一般而言我们可以将渲染后的字符串作为 HttpResponse 的第一个参数,作为构建响应报文的主体。
由于这个动作实在太常有了:加载--渲染--返回;所以django提供了两个快捷函数来处理这些事务。
这两个位于 django.shortcuts 模块中,在使用前记得先导入。
render(request, template_name[, context][, context_instance][, content_type][, status][, current_app][, dirs][, using])
这个函数实现查找,加载,渲染,构建 HttpResponse 对象一整套流程,所以我们可以使用它来节省许多功夫。
request:用于生成 response 对象的 request 对象。
template_name:模板名称,或者是包含许多模板名称的列表。
context:渲染使用的python字典。
context_instance:1.8版本起废弃,这里不再讨论。
content_type:指定 MIME 类型,默认为 DEFAULT_CONTENT_TYPE 的值。
status:响应的状态码,默认为200.
current_app:指示哪个应用包含当前的视图。1.8版本后废弃,现在要设置 request.current_app 进行代替。
using:用于加载模板使用的模板引擎的名称。
例子:
from django.shortcuts impor