9.Django(模板系统、语法、变量、过滤器)
静态页面:浏览器发送一个请求到服务端,对应相应的views函数,返回一个html页面(如果html里面有数据,这些都是前端标签或者js里面构建的数据)
动态页面:浏览器发送一个请求到服务端,对应相应的views函数,views函数这里结合数据库以及后端的数据,将这些数据融合在html页面中,返回一个一个含有后端以及数据库中的数据的html页面。
什么是模板系统?
简单来说,模板系统就是在html页面想要展示的数据库或者后端的数据的标签上做上特殊的站位(类似于格式化输出),通过render方法将这些站位的标签里面的数据替换成你想替换的数据,然后再将替换数据之后的html页面返回给浏览器,这就是模板系统。
我们可以借助模板系统返回给浏览器⼀个动态⻚⾯,模板系统⾥⾯提供的render⽅法可以进⾏html与后端数据的渲染,形成最终的html⽂件,交由return由return返回给浏览器,模板系统还提供了过滤器,标签,⾃定制标签,⾃定制过滤器等相关功能。
重新创建一个template_pro项目
语法
{{变量}} 只是替换单纯的数据
{% 逻辑 %} 替换逻辑部分 for if 等等
在前端的标签里面做一些模板系统提供给你的上面占位符,然后通过render方法将这些占位符的标签的内容替换成后端的数据,形成最终的html文件,最后交由return将最终的html文件返回给浏览器。
变量
-
简单示例
views:
def home(request):
name = '牧羊小董'
age = '21'
hobby_list = ['唱跳', 'rap', '篮球']
dic = {'classname': '人工智能plus', 'since': 2019}
return render(request, 'home.html', {'name': name, 'age': age, 'list': hobby_list, 'dict': dic})home.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<ul>
<li>{{ name }}</li>
<li>{{ age }}</li>
<li>{{ list }}</li>
<li>{{ dict }}</li>
</ul>
</body>
</html> -
万能的点
对于用户体验来说,你替换这些可迭代的数据比如列表、字典,能否将里面的内容一个一个展示出来,而且并不是通过整体展示,通过万能的点。
views:
def home(request):
name = '牧羊小董'
age = '21'
hobby_list = ['唱跳', 'rap', '篮球']
lis = [1, ['河北', '保定'], 3]
dic = {'classname': '人工智能plus', 'since': 2019}
return render(request, 'home.html', {'name': name, 'age': age, 'hobby_list': hobby_list, 'list': lis, 'dict': dic})home.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h1>首页</h1>
<ul>
<li>{{ name }}</li>
<li>{{ age }}</li>
<li>{{ hobby_list.1 }}</li>
<li>{{ list.1.1 }}</li>
<li>{{ dict.classname }}</li>
</ul>
</body>
</html> -
补充
def index(request):
name = '牧羊小董'
name_list = ['王阔', '天琪', '傻强', '志晨', '健身哥']
lis = [1, ['冠状病毒', '武汉加油'], 3] # lis[1][1]
dic = {'classname': '⼈⼯智能'}
# 既然可以⽤万能的点,那么我们通过变量使⽤对象也是可以的。
class A:
def __init__(self,name,age):
self.name = name
self.age = age
def func(self):
return '小董教你学python'
obj = A('小董', 18)
# locals() 只能在教学期间使⽤,在⼯作中不允许使⽤
print(locals())
return render(request, 'index.html', locals())
<li>{{ obj.name }}</li>
<li>{{ obj.age }}</li>
<li>{{ obj.func }}</li>通过变量不仅可以替换数据类型,还可以替换对象。
过滤器
-
定义
过滤器:可以在html页面对你从后端传递过来的数据进一步加工。⽐如:后端name = 'barry'你通过render⽅法渲染到前端,那么前端拿到这个name肯定是⼀个⼩写的barry,但是我们更改了需求,我们需要前端拿到的name是⼤写的BARRY。你怎么做?我可以在后端先变成⼤写,然后再传递到前端。这样有问题,只要更改后端,就意味着你的线上项⽬要重新启动,⾮常影响⽤户体验。基于这种情况,我们可以利⽤模板系统给我们提供的过滤器在前端⻚⾯直接更改,这样不会使我们的项⽬重新启动,⽤户体验感很好。
过滤器提供了⼤约60种⽅法。https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#fifilters 。
-
语法
{{变量|过滤器名字:参数}}
-
注意事项:
1、过滤器支持"链式"操作。即一个过滤器的输出作为另一个过滤器的输入。
2、过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
3、过滤器参数包含空格的话,必须用引号括起来。比如使用逗号和空格去连接一列表中的元素,如:{{ list|join:', ' }}
4、'|' 左右没有空格!没有空格!没有空格!
-
default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。
a = ''
b = 1
<div>{{ a|default:'什么都没有' }}</div>
<div>{{ b|default:'什么都没有' }}</div> -
length:返回值的长度,作用与可迭代对象。
name_list = ['王阔', '天琪', '傻强', '志晨', '健身哥'] desc = '过滤器教学' dic = {'classname':'人工智能', 'since':2019} <div>{{ desc|length }}</div> <div>{{ name_list|length }}</div> <div>{{ dic|length }}</div>
-
filesizeformat:将值格式化为一个“人类可读的”文件尺寸
size = 13453456 <div>{{ size|filesizeformat }}</div>
-
slice:切片,支持python中可以用切片的所有数据类型
name_list = ['王阔', '天琪', '傻强', '志晨', '健身哥'] desc = '过滤器教学' <div>{{ name_list|slice:':3' }}</div> <div>{{ name_list|slice:'5:1:-1' }}</div> <div>{{ desc|slice:'::2' }}</div>
-
date时间格式化
先要将settings里面的失去配置改成TIME_ZONE = 'Asia/Shanghai'
t = datetime.datetime.now() <div>{{ t }}</div> <div>{{ t|date:"Y-m-d H:i:s" }}</div>
-
truncatechars:如果字符串字符多与执行的字符数量,那么会被截断,截断的字符串将以可翻译的省略号序列(“...”)结尾。省略号占是三个字符。
desc = '1999年3⽉,⻢云正式辞去公职,后来被称为18罗汉的⻢云团队回到杭州,凑够50万元⼈ ⺠币' <div>{{ desc|truncatechars:13 }}</div>
-
truncatewords:在一定数量的字后截断字符串,是截多少个单词。
content = 'i love china more than myself' <div>{{ content|truncatewords:3 }}</div>
-
cut:移除某个或者某些字符
words = 'my name is barry' <div>{{ words|cut:'m' }}</div> <div>{{ words|cut:'na' }}</div>
-
join:设置连接符将可迭代对象的元素连接在一起与字符串的join方法相同。
name_list = ['王阔', '天琪', '傻强', '志晨', '健身哥'] str1 = 'love' <div>{{ name_list|join:'*' }}</div> <div>{{ str1|join:'_' }}</div>
-
safe
后端想前端渲染一些数据,有些数据是不安全的,比如在博客园发表一篇博客里面内容:金p梅,博客园是不允许你发表的;还有就是评论区,如果你输入一个标签<script>alter('666')</script>如果前端或者浏览器没有任何措施,你的博客是不是就出发一个时间,这叫做xss攻击。我们为了防止这样的攻击怎么做呢?
Django的模板中在进行模板渲染的时候会对HTML标签和Js等语法标签进行自动转义,原因仙儿意见,这样是为了安全。如果我们执意想要在前端渲染一些标签数据而不让模板系统进行转义,我们就需要利用过滤器safe。
value1 = '<a href="http://www.baidu.com">点我</a>' value2 = '<script>alert(666)</script>' <div>{{ value1 }}</div> <div>{{ value2 }}</div> <div>{{ value1|safe }}</div> <div>{{ value2|safe }}</div>
-
timesince(了解)
year_12 = datetime.datetime.now().replace(year=2012,month=6,day=28) year_18 = datetime.datetime.now().replace(year=2018,month=3,day=1) <div>{{ year_12|timesince:year_18 }}</div> <div>{{ year_12|timesince }}</div>
-
timeuntil(了解)给定日期到现在过去了多少时间
pass
-
过滤器的链式操作
a = 'hello' <div>{{ a|upper|join:'_' }}</div>
-