使用Django 的Templates系统,不仅实现了前后端分离、动态生成html;而且可以实现模板继承,减少重复代码等
前言
Django 项目可以配置0个、一个或者多个模板引擎,当执行startproject
命令创建项目时,会在settings.py
文件中自动配置默认使用一个模板引擎,如下
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': (os.path.join(BASE_DIR, 'templates'),#自定义路径
),#更推荐使用元组,因为不可修改
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
BACKEND字段:实现Django后端API的模板引擎类,内置有:django.template.backends.django.DjangoTemplates
和 django.template.backends.jinja2.Jinja2
DIRS字段:定义引擎应按搜索顺序查找模板源文件的目录列表,如上:搜索项目下的templates目录
APP_DIRS字段:告诉引擎是否应该在已安装的应用程序中查找模板,如上,设置为True,搜索各应用(app)下的templates目录。通常情况下,一个项目有多个app应用,为了分类管理及避免同文件使用错误,在app下创建templates目录结构为:app/templates/app/**.html
,app
这里的需要替换成具体的名称,视图中引用模板,使用相对templates目录的路径,即app/**.html
OPTIONS字段:特定后端的配置
根据上述配置,设置了APP_DIRS=True
,模板引擎搜索templates顺序为:DIRS > 当前项目安装app的templates目录 > 其他已安装app的templates目录,找到就停止搜索,找不到就抛出异常
由于历史原因,模板引擎的通用支持和Django模板语言的实现都存在于django.template 命名空间中
django.template.loader
模块定义了两个用于加载模板的函数
get_template(template_name,using = None)
返回一个 Template对象,找不到模板时会抛出django.template.TemplateDoesNotExist
异常
select_template(template_name_list,using = None)
根据模板名称列表。按顺序查找每个名称并返回存在的第一个Template对象
通过get_template()或select_template()返回Template对象,为对象提供了一个render()方法
Template.render(context=None, request=None)
context 模板上下文,为模板传递参数,字典类型
request,HttpRequest
类型,与引擎后端有关
render_to_string(template_name,context = None,request = None,using = None)
加载模板【get_template()或select_template()】和渲染【Template.render】,这是一个减少加载和渲染模板的重复性,django.template 提供的一个快捷方法
以上简单说明了模板引擎内部方法,真正使用时,可直接使用Django 提供的快捷方法django.shortcuts.render
,无需重复造轮子
除了使用内置引擎,也可以自定义引擎,这里不做展开
模板语言DTL(Django Templates Language)
变量
使用{{var}}
,若不存在,插入空字符
字典
模板中使用字典,与python语言使用有点区别
获取键值对{{dicts.items}}
获取值dicts.key #指定具体key
对象
获取对象值obj.attr
列表
获取索引值mylist.0