"""
模板层三种语法
{{}}:主要与数据值相关
{%%}:主要与逻辑相关
{##}:模板注释
django的模板语法是自己写的 跟jinja2不一样
1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行
2.模板语法的注释前端浏览器是无法查看的 {##},模板语法{##}是由后端处理的,当识别为模板注释时就会从html文件中移除了,不会返回给用户;而html注释是由前端浏览器对html处理时渲染时不做处理,但检查网页源码时还是能看见这些注释的。
"""
1.模板语法传值 字典和locals()
return render(request, 'demo02.html', {'n1': name, 'a1': age})
# 传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
return render(request,'demo02.html', locals())
# 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源
1.基本数据类型正常展示
2.文件对象也可以展示并调用方法
3.函数名也会自动加括号并执行将返回值展示到页面上(不支持额外传参)
4.类名也会自动加括号调用
5.对象不会加括号,但可以获取对象的一些数据属性
6.索引、键、属性只能通过句点方式取值
针对可以加括号调用名字模板语法都会自动加括号调用
语法:{{ value|过滤器名:参数 }}
过滤器用管道符隔开(无空格),最多支持多传入一个参数。
过滤器是支持链式的,可以将多个过滤器串起来,上一个过滤器的输出作为下一个的输入
过滤器 | 功能 | 示例 |
---|---|---|
default | 如果一个变量是false或者为空,使用给自定的值。 反之,使用变量的值。 | {{ value|default:“nothing”}} |
length | 对于字符串列表这类有length属性的,得到其值的长度 | {{ value|length}} |
filesizeformat | 将传入的数字当做文件的字节数,将其处理成合适展示的文件大小,如2048就会展示为2 KB |{{ value | filesizeformat }} |
slice | 对字符串进行切片 | {{value|slice:“2:-1”}} |
add | 将传入的数字或字符串做相加或拼接处理 | {{ value|length}} |
safe | 模板语法默认转义带html语法的文本,safe取消标签文本转义,让其可以被html渲染 | {{ value|safe}} |
truncatechars | 如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“…”)结尾。 | {{ value|truncatechars:9}} |
truncatewords | 在一定数量的字后截断字符串,处理同上…。 | {{ value|truncatewords:9}} |
cut | 移除value中所有的与给出的变量相同的字符串如果value为’i love you’,那么将输出’iloveyou’. | {{ value|cut:’ ’ }} |
timesince | datetime数据距离现在的时间(从现在起) | {{ blog_date|timesince }} |
timeuntil | datetime数据距离现在的时间(到现在止) | {{ blog_date|timesince }} |
date | datetime数据字符化输出 | {{ value|date:“Y-m-d H:i:s”}} |
# 1、
{% 标签名 %}
# 2、大多数标签都需要接收参数
{% 标签名 参数1 参数2 %}
# 3、一些标签需要有开始{% tag %}和结束标记{% endtag %}
{% 标签名 %}
...内容...
{% end标签名 %}
标签之forloop关键字,forloop模板语法自带的变量名
在这里插入代码片格式:
{% if 条件1(可以自己写也可以用传递过来的数据) %}
<p>今天又是周三了</p>
{% elif 条件2(可以自己写也可以用传递过来的数据) %}
<p>我是列表</p>
{% else %}
<p>我是else分支的!</p>
{% endif %}
eg:
# if判断
判断a是True打印
{% if a %}
<p>今天又是周三了</p>
{% elif l1 %}
<p>我是列表</p>
{% else %}
<p>我是else分支的</p>
{% endif %}
判断a传过来是true,打印今天又是周三了;a为false,则打印我是列表
a和l1都为false,则打印else分支
for循环可用的一些参数:
Variable | Description |
---|---|
forloop.counter | 当前循环的索引(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(从1开始) |
forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
forloop.first | 当前循环是第一次循环则返回True,否则返回False |
forloop.last | 当前循环是最后一次循环则返回True,否则返回False |
forloop.parentloop | 本层循环的外层循环 |
{% for i in l1 %}
<p>{{ forloop }}</p>
<p>{{ i }}</p>
{% endfor %}
# for与if混合使用
{% for foo in l1 %}
{% if forloop.first %}
<p>这是我第一次循环</p>
{% elif forloop.last %}
<p>我是最后一次循环</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>for循环的可迭代对象内部没有元素,根本没法循环</p>
{% endfor %}
解析:
forloop.first: 判断本次循环是不是第一次,是,就执行下面的代码
forloop.last: 判断本次循环是不是最后一次,是,就执行下面代码
empty: 你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)
# 循环字典
1.循环键
{% for r in d1 %}
<p>{{ r }}</p>
{% endfor %}
2.循环键keys
{% for foo in d1.keys %}
<p>{{ foo }}</p>
{% endfor %}
3.循环值values
{% for foo in d1.values %}
<p>{{ foo }}</p>
{% endfor %}
4.items
{% for foo in d1.items %}
<p>{{ foo }}</p>
{% endfor %}
解析:
.items : 返回可遍历的(键, 值) 元组数组。
with起别名
django模板语法取值操作:只支持点语法
点语法既可以索引也可以点键
用with起别名方法取出字典中NB
user_dict = {'name':'jack', 'age':18, 'gender':'male', 'hobby':[111,222,333,{'info':'NB'}]}
{% with user_dict.hobby.3.info as name %}
<p>
{{ name }}
</p>
{% endwith %}
模板的继承
当我们多个页面有相似的页面,我们可以采用下列方法
1.我们直接复制粘贴>>>创建一个新的html
2.模板的继承
1.在模板中使用block划定子板>>方便以后修改的区域
{% block 区域名称 %}
{% endblock%}
2.子版继承母板
{% extends 'home.html'%}
{% block 区域名称 %}
子板自己的内容
{% endblock%}
注意:子板也可以继续使用子模板的内容
{{block.super}}
关于模板中的继承,,至少有三个区域的模板可以继承去渲染,分别是页面内容区、CSS样式区、JS代码区
提前将被导入的html页面写好。其他html页面想使用就可以导入
{% include '导入的html文件名'%}
{% include 'myform.html'%}