模板引擎决定以何种方式组织代码
一个项目可以有一个或者是多个模板引擎,Django里面主要两个模板引擎:DTL、Jinja2。
Jinja2之前Flask笔记里面有,点击跳转
https://www.cnblogs.com/gltou/p/16828437.html
DTL介绍
DTL是django原生的模板系统,Django1.8之前,Django框架只支持DTL。后面的版本可以兼容多个模板引擎了。
模板的好处
增强代码的可阅读性
增强代码的可维护性
增加代码的可扩展性
关于DTL和Jinja2的区别以及谁更好,我简单找了两篇博客,一个是阐述DTL优于Jinja2,一个是阐述Jinja2优于DTL的。个中差异,如何选择,因项目而议,因熟练而议。本文主要讲解的是
DTL的使用
,下面的示例代码大家看的时候要注意。
DTL>Jinja2:
https://www.cnblogs.com/veoco/p/14317460.html
Jinja2>DTL:
https://www.codenong.com/js700fe4300a74/
2.Django模板相关配置
掌握 settings.py中模板相关的配置
了解 多个模板引擎支持情况下配置
掌握 模板的加载顺序
settings.py文件templates属性相关配置
BACKEND:模板引擎配置,目前Django支持以下两个模板引擎,即DTL和Jinja2
默认是DTL
django.template.backends.django.DjangoTemplates
也可以配置成Jinja2
django.template.backends.jinja2.Jinja2
DIRS:模板引擎按列表顺序搜索这些目录以查找模板源文件。每种模板引擎后端都定义了一个惯用名称作为应用内部存放模板的子目录名称。
DTL:templates目录
Jinja2:jinja2目录
APP_DIRS:决定模板引擎是否应该进入每个已安装的应用(即模块)中查找模板。改为True允许进入查找时,还需要在settings.py文件中将应用名称(即模块名称)追加到
INSTALLED_APPS
属性中。
OPTIONS:其他选项配置
如果需要同时支持两种模板引擎,应该怎么修改配置文件呢?
注意,配置文件添加好之后,要安装jinja2,因为django没有自带jinja2
存在两种模板引擎,两个模板引擎对应的目录下都有index.html,访问哪个呢?
模板文件的查找规则get_template('index.html'),根据TEMPLATES添加的模板引擎先后顺序进行查找。当遍历完位置在第一个的模板引擎目录以及已安装应用(模块中)对应的目录,找不到,才回去下一个配置的模板引擎中查找对应的html文件。实际工作项目中,当同时存在两个模板引擎时,除了将模板HTML放到两个引擎对应的目录下面。在HTML模板文件命名会以模板引擎不同做标记区分,避免同名文件。
小结一下模板查找的顺序:按添加顺序查找,先根目录后模块目录
3.Django模板的使用
3.1.模板变量的使用
掌握 模板语法
掌握 Python中简单数据类型的渲染
掌握 Python中复杂数据类型的渲染
掌握 DTL与Jinja2的使用区别
渲染Python中的变量
将变量以字典类型传入到render函数中,模板通过{{变量名}}识别
渲染静态图片
疑问:我图片明明是放在medias目录里面的,为什么配置图片路径的时候是在media路径下?
这个上一篇笔记里面有讲解,访问本地静态文件,我们配置的路由寻址是在media路径下开头,任意结尾。通过正则匹配路径,路径没有问题,就会到MEDIA_ROOT配置的目录下去寻找对应的文件
渲染Python中的对象
DTL与Jinja2的使用区别
注意:变量名称中不能有空格或标点符号
下面的语法在DTL中不被支持
{{ object[
"
a.b
"
] }}
{{ object[
"
a b
"
] }}
3.2.3.模板注释
基本和Jinja2是一致的,{# 注释 #}和{% comment %}的注释查看网页源代码是
看不到
的,而HTML的注释<!--注释-->通过网页源代码是可以看到的。
3.2.4.URL解析
URL标签的使用:
通过路由名称逆向解析到对应的URL
static静态文件URL解析:
前置需知:
首先在settings文件中设置下STATIC_URL这个属性,这个属性的意思就是静态文件访问的url路径,你改成什么,访问的时候就访问什么地址。添加STATICFILES_DIRS属性,这个属性就是你静态文件在项目下的路径。
上述命令是如何访问到静态文件的呢
?简单讲下:{% static "图片名称" %}这个命令会根据你配置的STATICFILES_DIRS的目录,去这个目录里面查找图片。找到图片后,再根据你配置的STATIC_URL,将图片的URL传递给img便签的src属性。通过static标签找到图片后,需要通过{% load static %}对static进行解析展示。
DTL的URL解析与Jinja2的区别:
DTL:模板中使用
{% url
'
url_name
'
params %}
,视图中使用reverse()函数进行url解析
Jinja2:
{{ url_for(
'
index
'
) }}
3.2.6.当前时间显示
注意,图示的时间表示是规定格式,大小写代表不同的涵义不能乱改。详见官方文档:
https://docs.djangoproject.com/en/3.0/ref/templates/builtins/#std:templatefilter-date
3.2.7.小结:DTL模板标签和Jinja的使用区别
DTL与Jinja2大同小异,注意使用区别,主要集中在两个地方:
区别一:循环中的区别
区别二:URL解析的区别
3.3.1.模板的抽象和继承
将模板差异化(个性化)的代码使用{% block 名称 %}抽出来,使用{% extends %}继承模板代码。接着使用{% block 可变名称 %}对差异化代码重写,不重写,子模版会直接使用父模板的内容。如果想要复用差异化代码,使用{{ block.supper }}
注意:继承父模板时,extends语句得放在最前面,不然没有效果。
3.3.2.模板的包含
部分组件/功能/代码是大部分模板都需要用到的,怎么做呢?将这部分内容单独用一个html文件存放,使用{% include %}调用。
3.4.模板过滤器
了解 过滤器的作用
掌握 过滤器的使用
掌握 Django中常用的过滤器
掌握 DTL与Jinja2的使用区别
safe:将HTML转成普通字符串
如果传递过来的参数不是HTML格式的使用truncatechars截取,如果是HTML格式的使用truncatechars_html截取
备注:过滤器可以多个追加同时使用,方法和Jinja2一致,通过“ | ”追加对变量处理的过滤器
与Jinja2的区别
最大的区别就是过滤器的传参,DTL通过冒好,Jinja2是括号
3.5.自定义过滤器
了解 自定义过滤器的使用场景
掌握 Django中如何自定义过滤器
了解 与Flask中自定义过滤器的区别