Django-Templates

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' % }
          • 导入模板的同时,给导入的模板传递一个参数
    



刘小恺(Kyle) wechat
如有疑问可联系博主