Django模板层
一 模板简介
在刚刚介绍完的视图层中我们提到,浏览器发送的请求信息会转发给视图进行处理,而视图在经过一系列处理后必须要有返回信息给浏览器。如果我们要返回html标签、css等数据给浏览器进行渲染,我们可以在视图中这么做
from
上例所示,我们直接将HTML代码放到视图里,然后进行返回,这可以使我们很直观地看清楚浏览器从发送请求到看到前端界面内容的这个过程中视图的基本工作原理,但是这种将前端代码与后端代码完全耦合到了一起开发方式会使得程序的可维护性与可扩展性变差
前端界面一旦需要重新设计、修改,则必须对后端的
我们可以很容易想到的解决方案就是
# 1、首先将前端代码放入单独的HTML文件中
作为一个成熟的Web框架,上述方案早已被Django实现:
# 1、Django提供了模板系统 (Template System)用来专门定制html文件,一个html文件称之为一个模板
一个简单的示例如下
templates/index.html
<!DOCTYPE html>
templates/current_datetime.html
<!DOCTYPE html>
views.py
from
urls.py
from
二 模板的使用
2.1 标准API
Django内置了一套标准API(兼容任何模板引擎的BACKEND)用于查找/加载、渲染模板。历史原因,模板的相关实现都存在于django.template名称空间中。
# 例如
上述API了解即可,因为我们在日常开发过程中,常用的一个render方法(from django.shortcuts import render),其内部已经整合了上述API。
from
render参数介绍,详细使用见下一小节
1
2.2 模板引擎配置
要解析DTL,需要有专门的解析器,称之为template engine模板引擎,需要在settings.py中配置TEMPLATES列表,其默认值为空,但在创建项目时会自动生成如下配置
TEMPLATES
列表中一个字典就是一个引擎配置,一个django项目可以配置一个或多个模板引擎(当然,如果你不需要使用模板,也可以不配置),如下
TEMPLATES
1)关键配置项之BACKEND:
每个引擎都需要有专门的后端程序BACKEND,BACKEND的值为要导入的python类,Django为自己的模块系统以及非常受欢迎的Jinja2模板系统内置了后端
django
而其他模板语言的后端需要从第三方获得。
#1、基于安全性考虑,最好不要使用不知名作者开发的第三方模板系统
2)关键配置项之DIRS与APP_DIRS
由于大多数引擎加载的模板都是文件,这就涉及到文件的路径查找,所以在每个引擎配置的顶级都包含两个相似的配置来专门负责路径查找问题
'DIRS'
查找的优先级为: djanog会先依次检索每个引擎下的DIRS,然后按照APP_DIRS的规定去找模板,直到找到为止。下面我们就依次举例进行验证
我们先将ARR_DIRS设置为False来讨论加载顺序,如下
TEMPLATES
若调用render(request,‘story_detail.html’),查找顺序如下,找到为止
# 1、先检索列表中的第一个引擎,即'django' 引擎
若调用render(request,['story_1_detail.html', 'story_detail.html']),查找顺序如下,找到为止
# 一:首先查找模板story_1_detail.html
所以针对['story_1_detail.html', 'story_detail.html'],后一个模板通常作为第一个模板的备胎,从而保障第一个模板在未找到时依然能够找到模板作为替代品,这样便可以使我们的代码更为灵活,如下
def
然后我们ARR_DIRS设置为True来讨论完整的加载顺序,需要事先在每个app目录下顶层建立目录templates(注意,目录名字必须为templates),
/
然后配置如下
TEMPLATES
若调用render(request,‘story_detail.html’),查找顺序如下,找到为止
# 一:djanog会先依次检索每个引擎下的DIRS
ps:针对render(request,['story_1_detail.html', 'story_detail.html']),会按照列表中规定的模板顺序依次重复上述查找步骤,直到某一模板查找成功为止。
在一个项目的实际开发过程中,通常会包含多个app,多个app会有一些公共的模板文件,同时每个app也都会有自己对应的模板文件,要想清晰地组织这些模板,有如下两种解决方案
方案一:设置ARR_DIRS为False
#一:在项目根目录下的templates目录中新建子目录用来区分不同的模板归属
方案二:设置ARR_DIRS为True(推荐使用)
#一:在ARR_DIRS为True的情况下,会检索每个app的templates目录,所以需要事先创建好下述目录:
(3)关键配置项目之NAME
在调用render()时,除非指定了引擎,否则会按照列表规定的顺序依次使用引擎来查找/加载模板,直到查找/加载成功为止。
如果想选用指定的模板引擎,需要使用参数NAME为每个模板引擎设定唯一的名字,然后在render中使用using参数指定即可
#一:settings.py配置如下
ps:如果没有设定参数NAME,那么引擎的名字默认为BACKEND按照点为分隔符的倒数第二个值,例如
'django.template.backends.django.DjangoTemplates'
(4)关键配置项之OPTIONS
OPTIONS值为一字典,包含了要传递到模板后端的额外参数。比如
TEMPLATES
我们在模板中常用的变量{{ request }}就是'django.template.context_processors.request'的功劳。
更多配置项请参照官网https://docs.djangoproject.com/en/3.0/topics/templates/#module-django.template.backends.django
三 DTL语法
Django模板指的是用Django模板语言(DTL)标记的文本文档(如HTML、XML、CSV等任何文本文档都可以)或者python字符串(文本文档也是由字符组成)。
DTL的语法主要由四部分构成:变量、过滤器、标签、注释,如下
{
让我们来分别作详细介绍