django之模板层(template)
模板层
模板传值
"""
模板层三种语法
{{}}:主要与数据值相关
{%%}:主要与逻辑相关
{##}:模板注释
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.索引、键、属性只能通过句点的方式取
ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用

模板语法之过滤器(内置函数)
语法:{{ value|过滤器名:参数 }}
过滤器用管道符隔开(无空格),最多支持多传入一个参数。
过滤器是支持链式的,可以将多个过滤器串起来,上一个过滤器的输出作为下一个的输入
常用的过滤器
| 过滤器 | 功能 | 示例 |
|---|---|---|
| default | 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值。 | {{ value|default:"nothing"}} |
| length | 对于字符串列表这类有length属性的,得到其值 | {{ value|length}} |
| filesizeformat | 将传入的数字当做文件的字节数,将其处理成合适展示的文件大小,如2048就会展示为2 KB | {{ value|filesizeformat }} |
| slice | 对字符串进行切片 | {{value|slice:"2:-1"}} |
| add | 将传入的数字或字符串做相加或拼接处理 | {{value|add:1}} |
| 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"}} |
模板层之标签
数据来源djangoproject
标签之forloop关键字
forloop模板语法自带的变量名
标签之if判断
格式:
{% 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循环

解析:
forloop内置对象:运行结果解析
'counter0': 从0开始计数
'counter' : 从1开始计数
'first': True,判断循环的开始
'last' : Tues,判断循环的结束
for循环可用的一些参数:
| Variable | Description |
|---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(从0开始) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
for循环代码展示:
{% for i in l1 %}
<p>{{ forloop }}</p>
<p>{{ i }}</p>
{% endfor %}
前端页面展示

标签for与if混合使用及标签之empty
# 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: 你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)

循环字典
indexPage.html
# 循环字典
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模板语法取值操作>>>:只支持句点符
句点符既可以点索引也可以点键
{{ d1.hobby.2.a1 }}
with起别名:拿到字典中a的值
{% with d1.hobby.2.a as a_name %}
<p>{{ a_name }}</p>
{% endwith %}
在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式
# 输出 我是a
命名规范: 只能在with代码块儿的范围之内才能使用别名
模型层的views.py
def index_func(request):
a=100
# a=True
# l1=[12,23,34,45,56,67]
L1=[]
s=(11,22,33,44)
d1={'name':'kimi','age':19,'hobby':['read','music',{'a':'我是a','b':'我是b'}]}
return render(request,'indexPage.html',locals())
自定义过滤器、标签及inclusion_tag(了解)
如果想要自定义一些模板语法 需要先完成下列的三步走战略
1.在应用下创建一个名字必须叫templatetags的目录
2.在上述目录下创建任意名称的py文件 ,如mytag.py
3.在上述py文件内先编写两行固定的代码
from django import template
register = template.Library()
1.自定义过滤器(最大只能接收两个参数)
1.mytag.py
from django import template
register = template.library()
# 自定义过滤器(最大只能接收两个参数)
# 参数 过滤器 过滤器名字
@register.filter(name='myadd')
def my_sum(a,b):
return a+b
2.indexPage.html
# 加载过滤器
{% load mytags %}
<p>{{ n|myadd:100 }}</p>
3.后端
def index_func(request):
n=888
return render(request,'indexPage.html',locals())
4.前端页面结果是:988
2.自定义标签(参数没有限制)
1.mytag.py
from django import template
register = template.library()
# 自定义标签(参数没有限制)
# 参数 过滤器 过滤器名字
@register.simple_tag(name='mytag')
def my_tag(a,b,c,d):
return f'{a}-{b}-{c}-{d}'
2.indexPage.html
# 加载过滤器
{% load mytags %}
<p>{%mytag 'kimi' 'jason' 'kiki' 123 %}</p>
4.前端页面渲染结果是:

3.自定义inclusion_tag(局部的html代码)
1.mytag.py
from django import template
register = template.library()
# 自定义局部html
@register.inclusion_tag('menu.html',name='mymenu')
def my_menu(n):
html=[]
for i in range(n):
html.append('<li>第%s</li>'%i)
return locals()
2.indexPage.html
# 加载过滤器
{% load mytag %}
{% mymenu 10 %}
3.自定义的网页html
<ul>
{% for foo in html %}
{{ foo|safe }}
{% endfor %}
</ul>
4.前端页面渲染结果是:

总结:
1.自定义过滤器和自定义标签:在页面上通过特殊的语法,然后能调用mytag.py的函数,将函数返回值调用到标签或者过滤器的位置
2.自定义:在页面上通过特殊的语法,然后能调用py的函数将函数返回值传给到局部的页面html,将返回值渲染后返回给函数
模板的 继承与导入
模板的继承
当我们多个页面有相似的页面,我们可以采用下列方法
1.我们直接复制粘贴>>>创建一个新的html
2.模板的继承
1.在模板中使用block划定子板>>方便以后修改的区域
{% block 区域名称 %}
{% endblock%}
2.子版继承母板
{% extends 'home.html'%}
{% block 区域名称 %}
子板自己的内容
{% endblock%}
注意:子板也可以继续使用子模板的内容
{{block.super}}
关于模板中的继承,,至少有三个区域的模板可以继承去渲染,分别是页面内容区、CSS样式区、JS代码区

模板的导入
提前将被导入的html页面写好,其他html页面想使用就可以导入
导入的格式
{% include '导入的html文件名'%}
eg:
{% include 'myform.html'%}

浙公网安备 33010602011771号