模板常用语法:
这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
1、基础语法
1.1 Django模板中只需要记两种特殊符号:
1.1 {{ }}和 {% %}
1.2 {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作。
1.2 点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值
数字:{{ num }}
<br>
字符串:{{ string }}
<br>
字典:{{ name_dict }} --> {{ name_dict.keys }} --> {{ name_dict.values }} --> {{ name_dict.name }}
<br>
列表:{{ name_list }} --> {{ name_list.2 }}
<br>
集合:{{ set }} --> {{ set.1 }}
<br>
元组:{{ tup }} --> {{ tup.0 }}
<br>
类:{{ person }} --> {{ person.name }} --> {{ person.talk }}
.
.索引 .key .属性 .方法(方法后面不加括号)
优先级:
.key > .属性 .方法 > .索引
2、过滤器
最多只有一个参数
2.1 过滤器:Filters
return render(request,"template_text.html",{"new_num":""})
{{变量|过滤器:"参数"}}
default:
变量不存在或者为空时使用默认值 ,如果value值没传的话就显示nothing
{{ new_num|default:"2" }}
2.2 filesizeformat
# 将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
return render(request, "template_text.html", {"value": 1024 * 1024 * 1024})
{{ value|filesizeformat }} # filesizefomrat:1.0 GB
2.3 add +
给变量加参数
数字的加法,字符串和列表的拼接
add:{{ value2|add:"2" }} --> 列表相加:{{ name_list|add:name_list }} #add:4 --> 列表相加:['张三', '李四', '王五', '张三', '李四', '王五']
2.4 lower,upper,title
小写:{{value|lower}}
大写:{{value|upper}}
标题:{{value|title}} #首字母大写
可以写在一起:{{value|upper|lower|title}}
2.5 length
{{ value|length }}
返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
2.6 slice 切片
{{ name_list|slice:"0:2" }} #和python一样就是没有[]号 [0:2]
2.7 first,last
{{value:first}} #取第一个元素 和 {{value.0}}一样
{{value:last}} #取最后一个元素
2.8 join 字符串拼接
使用字符串拼接列表。同python的str.join(list)。
{{ value|join:" __ " }} #张三__李四__王五
2.9 truncatechars 字符串截取
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ long_str|truncatechars:9 }} #包括3个省略号 Django...
truncatewords :根据单词截断
2.10 date 日期格式化
import datetime
now = datetime.datetime.now()
{{ now|date:"Y-m-d H:i:s" }}2020-08-08 10:17:14
或者直接在settings.py里面定义格式
1. USE_L10N = False
2. 设置格式:
DATETIME_FORMAT = 'Y-m-d H:i:s'
TIME_FORMAT = 'H:i:s'
DATE_FORMAT = ‘Y-m-d
然后直接:{{ now }},就和上面一样的
2.11 safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全
比如:
"safe_text":"<a href='https://www.baidu.com'>点我</a>",
{{ safe_text}}
我们就会在页面上获得字符串:<a href='https://www.baidu.com'>点我</a>
有时候我们不想这样,我们就可以加个safe
{{safe_text|safe}} # 点我
3、自定义过滤器
3.1 在app下创建一个名为templatetags的python包(包的名字不能错,必须叫templatetags)
3.2 创建一个python文件,文件名自定义(mytags.py)
3.3 在python包中写:
```
from django import template
register = template.Library() # register的名字不能错
```
4. 写函数+加装饰器
```
@register.filter
def add_arg(value, arg): #只能写二个参数,一个是变量,一个是过滤器的参数
# 功能
return "{}__{}".format(value, arg)
```
5. 使用
在模板中:
```
{% load mytags %} #先用load加载 mytags这个文件
{{ person.name|add_arg:"我爱你" }}
```
4、标签tags
4.1 for
<ul>
{% for name in name_list %}
<li>{{ forloop.counter }}-{{ name }}</li>
{% endfor %}
</ul>
for循环可用的一些参数:
| Variable | Description |
|---|---|
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(到1结束) |
forloop.revcounter0 | 当前循环的倒序索引值(到0结束) |
forloop.first | 当前循环是不是第一次循环(布尔值) |
forloop.last | 当前循环是不是最后一次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
for ...empty
{% for name in name_list2 %}
<li>{{ name }}</li>
{% empty %}
为空了 #如果循环的对象为空的话,就输出它
{% endfor %}
4.2 if
{% if value2 > 2 %}
可以
{% elif value2 == 2 %}
不错
{% endif %}
if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
注意:
-
条件中不支持算术运算
-
不支持连续判断
{% if 5 > 4 > 1 %} 这样会报错 只有改成{% if 5 > 4 and 4 > 1 %} ok {% else %} no {% endif %}
4.3 with
就是重命名
{% with name_list as name%}
{{ name }}
{{ name }}
{% endwith %}
或者
{% with name = name_list %}
{{ name }}
{{ name }}
{% endwith %}