Django(2) - Django模板
1.Django模板介绍
基础概念
- 模板是具有一定的格式或骨架,可以动态的生成HTML
- 模板引擎决定以何种方式组织代码
- 一个项目可以有一个或者是多个模板引擎,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
- 默认是DTLdjango.template.backends.django.DjangoTemplates
- 也可以配置成Jinja2django.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"] }}



- 类中的成员方法调用不需要(),也不支持参数传递


思考:Django模板引擎DTL的for循环和Jinja2有哪些不一样呢?
3.2.模板标签的使用
知识点
- 了解 模板标签的作用
- 掌握 常用的模板标签
- 掌握 DTL和Jinja2的使用区别
模板标签是什么?
使用变量时有哪些不方便的地方:
- list/tuple如果没有循环标签,肯定很难办
- 如果能加上if等条件判断就好了
- 页面较多,如果能共用部分页面就好了
- ...........
模板标签的使用
和Jinja2差不多,语法: {% tag %} ,有一些标签有开始也需要有结束。
常用的模板标签
主要有7类
- 循环控制
- 条件控制
- 模板注释
- URL解析
- with语句块
- 当前时间显示
- 继承与包含(单独作为一个点阐述)
3.2.1.循环控制
语法参考

循环内自带的变量forloop

除了可以循环list和tuple,它还能循环dict

还支持重复循环(循环中再循环),通过 cycle 实现

DTL的for循环与Jinja2的区别
- 循环变量DTL中为forloop,Jinja2中为loop
- 当list为空时:DTL通过 {% empty %} 处理,Jinja2中为 {% else %}
- 循环中的再循环
- DTL: {% cycle 'odd' 'even' %}
- Jinja2: {{ loop.cycle('odd','even') }}
- DTL不支持continue和break
示例代码


3.2.2.条件控制
语法参考


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.5.with语句块
这个基本上是和Jinja2是一样的。实现块级作用域,块级里面的变量和一些方法,只在with这个代码块中有效果。

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.模板的继承和包含
知识点
- 了解 模板抽象和继承的使用场景
- 掌握 相关的几个标签
- 掌握 DTL与Jinja2的使用区别
使用场景:
- 每个页面都引用了公共的头部,js,css
- 有几个页面结构和内容及其相似(如:导航菜单)
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中自定义过滤器的区别
使用场景:Django自带的过滤器不满足我们的业务需求,对变量做较为复杂的处理,而后进行展示
自定义过滤器
新建的包只能叫这个名称:templatetags,在模块的目录下新建。新建的必须得是包,而不是文件夹,包可以被引入使用。编写过滤器的文件名没有强制要求


使用装饰器注册时,name不传默认就是函数的名称


注意事项:
- 添加自定义过滤器后记得重启开发服务器
- 自定义过滤器所在的模块需要添加到settings.py中的INSTALLED_APPS内

示例




Django(2) - Django模板的更多相关文章
- python Django教程 之模板渲染、循环、条件判断、常用的标签、过滤器
python3.5 manage.py runserver python Django教程 之模板渲染.循环.条件判断.常用的标签.过滤器 一.Django模板渲染模板 1. 创建一个 zqxt_tm ...
- Django(框架、模板)
day65 参考:https://www.cnblogs.com/liwenzhou/p/8296964.html Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间 ...
- 第三百一十节,Django框架,模板语言
第三百一十节,Django框架,模板语言 模板语言就是可以将动态数据在html模板渲染的语言 一.接收值渲染 locals()函数,写在请求响应render()函数里,可以将逻辑处理函数里的变量传到h ...
- Django框架之模板语法【转载】
Django框架之模板语法 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 一.模板语法之变量:语法为 {{ }}: 在 Django ...
- Django项目中模板标签及模板的继承与引用【网站中快速布置广告】
Django项目中模板标签及模板的继承与引用 常见模板标签 {% static %} {% for x in range(x) %}{% endfor %} 循环的序号{% forloop %} 循环 ...
- django的html模板中获取字典的值
在django的html模板中获取字典中的值应当直接使用 字典.[key] 的方式 {% for i in lists %} <li id="{{i.id}}" class ...
- Django框架 之 模板语言
Django框架 之 模板语言 浏览目录 标签 过滤器 一.标签 Tags 1.普通变量 普通变量用{{ }} 变量名由数字.字母.下划线组成 点.在模板语言中用来获取对象相应的属性值 示例: 1 2 ...
- Django继承HTML模板
Django在渲染模板的过程中可以实现模板样式的继承,以减少重复的代码 1.extend继承 模板.html: 模板内容 {{% block name1 %}} {{% enfblock %}} #n ...
- Django学习day6——模板
在day4中,你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python 代码之中. html = "<html><body& ...
- Django框架2——模板
django框架2--模板 直接将HTML硬编码到你的视图里却并不是一个好主意: 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改. 站点设计的修改往往比底层 Python 代码的修 ...
随机推荐
- Java程序设计(四)作业
要求:定义一个Java项目,项目名为"学号_姓名_题号",如:"20181101_张三_1",完成后将项目复制到桌面并压缩提交到邮箱82794085@qq.co ...
- Git、TortoiseGit中文安装教程,如何注册Gitee账号进行代码提交,上传代码后主页贡献度没显示绿点(详解)
今天给大家分享的是 Git 软件和 TortoiseGit 图形化软件的详细安装教程以及如何在 gitee 上进行代码提交. 首先我也是个刚接触 gitee 的一个小白用户,这些都是自己一边学一边记录 ...
- MVVM视图模型
- KNN算法之集美大学
在本篇文章中,我即将以在集美大学收集到的一些数据集为基础,使用KNN算法进行一系列的操作 一.KNN算法 首先,什么是KNN算法呢,这得用到老祖宗说的一句话"近朱者赤近墨者黑", ...
- 【单片机入门】(四)应用层软件开发的单片机学习之路-----ESP32开发板PWM控制电机以及中断的使用
引言 各位大佬,晚上好啊,在上一篇博客中,我们讲了什么是UART串口通讯,以及使用USB转TTL使得单片机可以和c#上位机做一个串口通讯,接下来,为大家带来PWM的概念原理,以及实际案例,使用PWM对 ...
- 统计Oracle数据库某个用户下面的对象个数
统计某个用户下面的对象个数 包括表,视图,同义词,函数,存储过程,包,触发器,索引,约束,序列. 1. sql语句 SELECT (SELECT COUNT(*) FROM USER_TABLES) ...
- Java环境搭建(推荐jdk8)
本人使用的Windows10操作系统 1.Jdk8下载和安装 下载地址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-d ...
- .net 温故知新:【9】.NET日志记录 ILogger使用和原理
日志 日志作为我们程序记录的"黑匣子"是不论什么系统都会使用到的,比如我们经常使用的log4net就是第三方日志记录提供程序.NET 支持使用各种内置和第三方日志记录提供程序的日志 ...
- Https Webservice接口的免证书调用
目录 前言 思路 方案 Axis调用 HttpClient调用 参考链接 前言 在调用https协议的Webservice接口时,如果没有做证书验证,一般会报javax.net.ssl.SSLHand ...
- Go实现常用软件设计模式三:生成器模式
目录: 举个栗子 概念介绍 使用场景 1.举个栗子 2.概念介绍 使用一个中间件来帮助我们填充创建对象参数 优点: 将创建逻辑集中在一起 复用了不同参数创建逻辑 缺点: 新增生成器类 3.使用场景 m ...