【Django】 03.Template
## 渲染模板:
#### 两种方式:
1.`render_to_string`:找到模板,然后将模板编译后渲染成python的字符串格式。最后通过HttpResponse类包装成一个对象返回。
2.`render`:直接将模板渲染成字符串并包装成HttpResponse对象。
## 模板路径配置:
1.模板文件应放在`template`文件夹中
2.调用模板文件,不用写文件夹路径,直接写名字就行,会默认从template文件夹调用
3.这部分设置在settings.py文件`TEMPLATE属性`中,可以更改其中的`DIRS`属性来更改默认查找位置
4.settings.py关于templates配置的属性介绍:
- `DIRS`:这是一个列表,在这个列表中可以存放所有的模板路径,在使用render方法渲染函数时,会在这个列表中优先查找路径
- `APP_DIRS`:默认为`True`,设置为True时,会在`INSTALLED_APPS`的安装了的app下的templates文件夹中查找模板
- 查找顺序:
- 先在DIRS列表下查找模板,如果有,就返回
- 如果DIRS列表中路径找不到,会检查当前视图函数所在的app是否安装,若安装,在当前这个app下的templates文件夹中查找模板
- 若当前app下templates文件夹下没找到模板,则在其他已安装的app的templates文件夹中查找
- 若还没找到,跑出TemplateDoesNotExist异常
## 模板变量:
1.模板中使用变量要在html文件中,把变量放在`{{ 变量 }}`中
2.变量内容放在render的`context`参数中,以`字典形式{'变量名': 变量值}`
3.四种变量访问方式:
- 类属性:`变量名.属性名`
- 列表/元组:`变量名.下标`
- 字典:`变量名.key名`
- 字符串:`变量名`
4.注意:在变量类型是字典时,尽量不要使用`keys,values,items`等字典的方法来做key名,不然访问时会出现`{{ person.items }}`等会出现歧义
## 模板标签:
#### if语句标签:
1.所有标签都是在`{% 语句内容 %}`之间
2.if标签是闭合标签,就是要有结束标记`{% endif %}`
3.if标签内语法跟python中基本类似
#### for标签:
`for...in...`类似python中的for...in...语句,可以遍历列表、元组、字符串、字典等可迭代对象。
如果想要反向遍历,在for..in..标签后加`reversed`
`for..in..empty`:这个标签跟for..in...一样,只不过如果遍历的对象没有元素(即为空)时,会执行`empty`中的内容。
遍历字典时,使用`items`,`keys`,`values`等方法
在遍历时,`DLT`提供了一些变量:
- `forloop.counter`:当前循环的下标,从1开始
- `forloop.counter0`:当前循环的下标,从0开始
- `forloop.recounter`:当前循环的反向下标值,比如列表有5个元素,第一次遍历得到的值就是5。
- `forloop.first`:是否是第一次遍历
- `forloop.last`:是否是最后一次遍历
**注:模板中的for..in..没有`continue`和`break`语句**
#### with标签:
1.用来定义便于调用
2.有两种使用方式
- with xxx=xxx
- with xx as xx
3.定义变量仅在with标签内有效
#### url标签:
``
带参数url:
查询字符串url(拼接):
#### autoscape自动转义标签:
1.DTL中默认已经开启了自动转义,会将特殊字符进行转义,如`<`转义为`<`等。
2.如果变量是确实可信任的,可以使用`autoscape`标签关掉自动转义。
#### spaceless标签:
作用:去掉作用域内的代码空白
#### verbatim标签:
作用:去除DTL对作用域内代码的解析,如{{ xxx }}会被解析为变量
## 过滤器:
#### add过滤器:
{{ value|add:arg }}
如果两个参数都是:
- 整形或者是数字字符串,进行数值运算
- 字符串型,进行拼接
- 列表,进行组合
#### cut过滤器:
{{ value|cut:arg }}
移除所有value中arg所指定的字符串。类似python中的`replace(str,'')`
#### data过滤器:
{{ value|date:arg }}
value传入日期,arg传入格式化方法代码
将日期按照指定格式格式化为字符串。
常用格式字符 | 描述 | 示例
---|---|---
Y | 四位年份 | 2019
m | 两位数字的月份 | 01-12
n | 月份,1-9前没有0 | 1-12
d | 两位数字的天 | x-09
j | 天,1-9前面没有0 | x-9
g | 小时,12小时格式,1-9前没有0 | 9:xx:xx
G | 小时,24小时格式,1-9前没有0 | 21:xx:xx
h | 小时,12小时格式,1-9前有0 | 09:xx:xx
H | 小时,24小时格式,1-9前有0 | 21:xx:xx
i | 分钟,1-9前有0 | xx:01:xx
s | 秒,1-9前有0 | xx:xx:05
#### default过滤器:
{{ value|default:arg}}
将`False`值,比如`[]`,`''`,`None`,`{}`等在if判断中判定为False的值,都会使用False过滤器提供的默认值。
{{ value|default:arg }}
用arg值替换为False的value值,不为False则不处理,返回原value值。
#### default_if_none过滤器:
{{ value|default_if_none:arg }}
功能同default,不过只有在值为none时才过滤,其他false值不过滤。
#### first,last过滤器:
{{ value|first }}
{{ value|last }}
取出列表中第一/最后一个元素。
#### floatformat过滤器:
{{ value\|floatformat[:arg] }}
四舍五入的方式格式化浮点型数据。如果没有传参数,会默认保留1位小数,若小数后面全为0,则只保留整数。可以传递参数来标识具体保留几位小数。
1. 没传参数:
value | 模板代码 | 输出
---|---|---
34.23234 | {{ value\|floatformat }} | 34.2
34.0000 | {{ value\|floatformat }} | 34
34.260 | {{ value\|floatformat }} | 34.3
2. 传参数;
value | 模板代码 | 输出
---|---|---
34.23234 | {{ value\|floatformat:3 }} | 34.232
34.00000 | {{ value\|floatformat:3 }} | 34.000
34.26000 | {{ value\|floatformat:3 }} | 34.260
#### join过滤器:
{{ value|join:arg }}
相当于python中的join方法,用一个字符串当连接符,连接一个列表。
#### lower upper过滤器:
{{ value|lower }}
{{ value|upper }}
大小写转换
#### random过滤器:
{{ value|random }}
作用相当于python中的random.choice,从可迭代对象中随机取出一个值。
#### safe过滤器:
{{ value|safe }}
相当于autoscape自动转义标签,防止value值被转义
#### slice过滤器:
{{ value|slice:arg }}
切片操作,arg参数写法同列表切片操作
#### striptags过滤器;
{{ value|striptags }}
去除value中的html标签
#### truncatechars过滤器:
{{ value|truncatechars:arg }}
如果给定的value字符串超过了所给定的长度,会进行切割,并拼接上`...`.
- 如果字符串长度小于给定的arg,不会进行操作
- 给定的arg包含了`...`的长度,所以若保留两个字符,应给定arg=5
#### truncatechars_html过滤器:
{{ value1|truncatechars_html:arg }}
作用同truncatechars,不过在切割时会保留html标签。
## 自定义过滤器:
1. 在app下创建一个python包,叫`templatetags`。注意,必须叫这个名字,不然django找不到。
2. 在这个包下面创建一个py文件,用来存储过滤器。
3. 在新建的py文件中,定义过滤器(也就是函数)。函数第一个参数是被过滤的值也就是value,第二个参数是arg,可有可无。最多两个参数。
4. 写完过滤器后,要注册过滤器。
5. 把这个过滤器所在的app添加到`settings.py`文件中的`INSTALLED_APP`中,不然找不到过滤器。
6. 在html模板中使用load标签加载过滤器所在的py文件。
示例代码:
## 模板结构优化:
#### include标签:
提高模板代码复用性。有些模板的代码是重复的,可以单独抽取出来,以后哪里用到使用`include`导入进来。
如果想在`include`子模板时传递一些参数,可以使用`with xxx=xxx`的形式。
#### 继承:
子模板可以继承父模板的html代码,如果子模板需要有自己的代码,通过block接口实现。
## 加载静态文件:
使用static标签
1. 确保`INSTALLED_APP`中添加了`django.contrib.staticfiles`这条。(默认添加)
2. 确保在settings.py中设置了`STATIC_URL`。(默认设置已经为`STATIC_URL = '/static/'`即可)
3. 创建文件夹存储静态文件。
- 在app下创建static文件夹以存储app所使用的静态文件。为了防止app间的静态文件存在同名不能分辨的现象,推荐在app下的static文件夹下新建一个与app同名的文件夹,将静态文件放入其中。这样调用时路径就为`app_name/xxx.jpg`同名文件不会冲突。
- 一些静态文件与app不挂钩。可以在settings.py文件中添加`STATICFILES_DIRS`属性,以后DTL就会在这个属性所指向的路径下查找静态文件。
5. 在模板中使用`load`标签加载static标签。因为static不是DTL的内置标签,若要想省去这步,可在settings.py文件的TEMPLATES下的OPTIONS下添加属性。
6. 使用`static`标签导入静态文件。
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
【Django】 03.Template
http://blog.rainna.xyz/2020/11/22/2020-11-22-03.Template/