Templates 简介
- Templates介绍
- Templates他本身是由一大堆静态代码实现的,在Django中,他处于框架的中部,处于Model部分的前端,它就是一个存放从Model中获取到数据的载体。
- Templates组成
- 静态部分:
- 我们在浏览器中看到的永远不会变化的那部分框架内容包含html、css、js
- 动态部分:
- 我们在浏览器中看到的永远变化着的那部分内容,基本上都是数据就是模板语言
- Templates的相关setting配置部分
- BACKEND Django项目使用的后端模板引擎
- 1、'django.template.backends.django.DjangoTemplates'
- 2、'django.template.backends.jinja2.Jinja2'
- 其中的第一种,是我们常用的,也就是默认使用的模板引擎,
- DIRS Django项目的模板目录
- 为tem模板的默认寻找的目录
- APP_DIRS Django项目是否可以去应用目录下面找模板文件,为tem模板的默认寻找 路径
- true的意思就是引擎是在已安装应用程序(的目录)内查找模板源文件
- OPTIONS Django项目的其他配置项
- 这条配置的格式是一个字典,里面配置的参数主要是传递给模板引擎用的。
- templates目录的配置方式
- 一:直接从应用目录中查找模板文件
- 方法、
- 我们直接在应用目录里面创建模板文件,
- 优点与缺点
- 应用是一个完整的应用,应用在进行整体迁移的时候,效果会很好。但是我们模板在重用某些代码的时候,效果不是太好,需要自己重写将代码再写一遍
- 二:直接从我们配置的模板目录中查找模板文件。
- 方法
- 在项目根目录下创建templates目录,然后再在该目录下创建具体的应用目录,最后在应用目录里面创建具体的模板文件。
- 优点
- 进行应用的迁移需要重新进行模板文件的配置,但是模板和应用之间的解耦程度很好,而且提高了模板的重用
- 常用配置
- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- 'DIRS': [os.path.join(BASE_DIR, 'templates')], 此条在setting中的templates中配置
Django处理模板文件的流程
- 1.加载:根据给定的路径找到模板文件,编译后放在内存中
- 就是render函数的第二个参数的作用,引擎从templates目录中找到book_app/book.html文件
- 2.渲染:
- 使用上下文数据对模板传值并返回生成的字符串
- 检查模板文件中有没有变量名标签
- 模板中有变量名标签的话,然后查看一下我的context内部有没有对应变量名标签的内容
- 如果有的话,将变量带入到模板中(如果变量是一个对象执行缩进内容的操作)
- 检查对象涉及到哪个具体的类,进一步确认该类来自于哪个models文件
- 检查该类是否是继承与Django的models文件中的Model类
- 使用Django的models的objects类管理器对该类对象进程操作
- 类对象的操作会被orm转换成类对应的数据表的sql语句操作
- sql语句查询到的数据,会被orm转换成model类对象识别的数据
- 类对象将orm转换后的数据,返回给views文件函数中的变量
- 变量名将这些属性值,传递给模板标签变量,然后载入到模板文件中
- 备注(render函数):
- 为了减少开发人员重复编写加载、渲染的代码,Django提供了简写函数render,用于调用模板,将模板加载,模板代码渲染,和生成response对象封装到一起;
模板语言(主要是动态部分)
- 变量名标签
- 语法规则:
- 命名规则
- 变量名必须由字母、数字、下划线(不能以下划线开头)组成 注意:(不能带( )和传入任何参数),如果变量不存在,可以插入空字符串'';
- 遇到 变量名.属性名 的解析顺序
- 1.字典book['title']
- 2.先属性后方法,将book当作对象,查找属性title,如果没有再查找方法title()
- 3.如果是格式为book.0则解析为列表book[0]
- 解析顺序:字典-->对象-->列表
- 流程控制标签
- for 标签
- 语法规则
- {\% 代码段 \%}
- 第一种for循环标签
- 第二种for循环标签
- 注意:for循环接收的参数一定要是可遍历类型的值
- if 标签
- 第一种if判断标签
- 第二种if判断标签
- 条件运算符
- 条件算数运算符
- == 相等
- != 不等
- < 小于
- > 大于
- <= 小于等于
- >= 大于等于
- 条件逻辑运算符
- and、or、not
- 注意在标签中不能and和or同时出现
- 模板文件中的过滤器
- 语法:
- 变量名|过滤器 (不需要参数的情况)
- 变量名|过滤器:参数 (需要参数的情况)
- 使用管道符号|来应用过滤器,用于进行计算、转换操作,可以使用在变量、标签中
- 模板中常用的过滤器(length(长度)、default(默认值)、date(日期))
- 长度length:
- 格式:data|length
- 作用:返回字符串包含字符的个数,或列表、元组、字典的元素个数
- 增加add:
- 格式: num|add: int
- 作用:对前面的数字进行加法, int可以为负值
- 默认值default:
- 格式:data|default:'默认值'
- 作用:如果变量不存在,则返回默认值,默认值要用括号括起来
- 日期date:
- 格式:data|date:"日期格式"
- 作用:用于对日期类型的值进行字符串格式化,常用的格式化字符如下
- 日期 时间的标准格式:
- 几种日期设置情况的结果
- 当不使用日期过滤器的时候,默认结果格式为
- 当使用当使用过滤器不进行格式化默认的的结果
- 当使用过滤器格式化日期的时候,默认结果格式为
- 如果想更改默认格式化的风格,需要进行如下设置;
- 调整后的结果为:
- 自定义过滤器的方法
- 原理:
- 在定义过滤器时,需要用 Library 实例来注册它,这样就能通过Django的模板语言来使用了,还要保证templatetags在已经INSTALLED_APPS的应用的目录里面
- 自定义过滤器就是在模板中调用python中的函数和方法;
- 步骤:
- 在应用目录中的templatetags目录下,没有的话就创建一个,而且必须命名为templatetags
- 在templatetags目录下创建__init__.py的空文件
- 在目录下面创建一个存储自定义过滤器的py文件,可以自己定义这个名称,例如filters.py
- 在这个py文件中用Library进行注册
- 并定义一个自定义过滤
- 示例:
- 注意:
- register这个对象名称不能更改
- 如果想设置带参数的过滤器,需要定义两个函数的形参;
- 在想要使用的模板l中,使用自定义过滤器mod
- {\%load filters\%} 导入模块
- 自定义标签的方法(最常用的简单标签)
- 原理:
- 在定义标签时,需要用 Library 实例来注册它,这样就能通过Django的模板语言来使用了,还要保证templatetags在已经INSTALLED_APPS的应用的目录里面
- 自定义标签就是在模板中调用python中的函数和方法;
- 简单的自定义标签(simple_tag)的创建和使用步骤:
- 在想要使用自定义标签的应用目录中的templatetags目录下,没有的话就创建一个,而且必须命名为templatetags
- 在templatetags目录下创建__init__.py的空文件
- 在目录下面创建一个存储自定义标签的py文件,可以自己定义这个名称,例如label.py
- 在这个文件中用Library进行注册
- 自定义一个标签:
- 示例:
- 注意:自定义标签函数可以接受不定长参数
- 在模板中导入和使用
- 注释标签
- 单行注释
- 多行注释
- {\%comment\%}
- ...
- {\%endcomment\%}
- 模板的继承
- 模板继续的好处
- 模板继承和类的继承含义是一样的,主要是为了提高代码重用,减轻开发人员的工作量简单来说就一句话:省事,代码重用,提升开发效率
- 典型应用场景:
- 网站的头部、尾部信息(经常用于将网页模板的框架先定义好,然后再向其中添加不同模板的展示内容)
- 父模板和子模板
- 父模板
- 父模板的定义
- 如果发现在多个子模板中重复使用了同一段代码, 那就应该把这段重复的内容定义到父模板中, 怎么定义到父模板中,就是使用block标签。
- 父模板的放置位置
- 项目的templates模板目录
- 父模板命名
- 一般都携带base关键字
- 父模板的内容:
- 一般使用 ... 来表示子模板使用的位置
- 示例:
- 子模板
- 子模板的定义
- 引入父模板,在父模板的框架中添加内容,在父模板的基础上进行模板文件的设计
- 子模板的首行:
- 首行一定是要导入的模板文件:{\%extends '父模板文件名'\%}
- 子模板的内容:
- 替换父模板中的block区域内容
- ...
- 注意:添加到父模板的指定位置不再模块范围的其他内容,不会加载到父模板中,最终也不会显示。
- 在子模板中引用父模板中的内容
- 示例:
- 模板的导入
- 应用场景:
- 当父模板已经定义,大部分模板都继承了父模板的内容,又有一部分模板有其他一些完全相同的区域,这时候,我们已经不能再创建新的父模板,我们可以通过创建自定义模板,然后在相同页面的部分,插入自定义模板,这样可以实现一块代码被多个模板文件引用的情况
- 使用方法
- 在继承模板文件的目录中定义模板文件
- 在需要继承自定义的模板文件中使用,include标签来导入自定义模板
- 示例:{ % include ' common/status.html '% }
- 我们还可以通过include导入模板的同时,给模板传递参数;通过with 关键字
- 示例:{ % include ' common/status.html ' with flag='flag' % }
- 导入模板的同时,给导入的模板传递一个参数