十、前端tag、自定义tag、filter和simple_tag
Django提供了一些函数,通过前端可以实现代码逻辑、字符串的处理等功能,一些复杂的功能如数据合法性判断、非法字符的过滤等可以通过后台代码实现前端自定义函数。
django提供了两种方法为前端实现自定义函数,分别是filter和simple_tag.
一、前端tag
后台代码
def test(request):
'''定义一些变量给前端使用'''
import datetime
cur_time = datetime.datetime.now()
age = 18
name = 'marry'
article_content = 'django有自带的分页,非常的好用,代码如下:django有自带的分页,非常的好用,代码如下:django有自带的分页,非常的好用,代码如下:'
navs = ["我的日记a","我的相册",'我的心情','我的心情1','我的心情2','我的心情3']
comments = '<h1 style="font-size:200px">你好呀</h1>'
h1_str = '<p style="font-size:98px">哼哼哼离嘛哼</p>'
js_str="<script>alert('哈哈哈哈')</script>"
article_content2 = "敏感词哼哼哼哼这是一个敏感词。。。"
say = "今天天黑得很早,没有星星也没有月亮,然后天空被展开成了二维空间。"
return render(request,'test.html',locals()) #locals()返回所有的变量,就不用使用字典一个一个的加了
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ age|add:"1" }} {# add加,int类型做加法 #}
<br>
{{ name|add:" 先生"|upper }} {# 字符串在后面加一个字符串 #}
<br>
{{ comments }}
<br>
----长度{{ navs|length }}
<br>
----{{ navs.0 }}
<br>
{{ article_content|truncatechars:"20" }}
{#截断字符串的,多余的字符串用...显示#}
<br>
{{ navs|slice:"0:3" }}{# slice切片,两个参数 #}
{#切片#}<br>
{#切片#}<br>
{#切片#}<br>
{{ navs|join:"," }}{# 以","连接这个list#}
<br>
{{ author |default:"管理员" }} {# default默认值 #}
<br>
{{ cur_time|date:'Y/m/d H:i:s' }} {# 时间格式化 #}
<br>
<br>
{{ name|upper }} {# 大写 #}
{{ name|lower }} {# 小写 #}
<br>
{{ h1_str |safe}} {# safe被认为安全的代码,会根据标签进行解析,如果不加safe则按字符串输出,不会被解析#}
{{ js_str|safe }}
{#如果后面加了safe的话,认为这个是安全的字符串,浏览器会按照标签解析#}
{#如果不加safe的话,就是一个普通的字符串,就不会按照标签解析#}
</body>
</html>
1、前端使用变量
{{ age }} {#后端的变量使用两个大括号括起来,可直接使用#}
2、truncatechars截断字符串
{{ article_content|truncatechars:"20" }} {#truncatechars 截断字符串,只显示20个,多余的字符串用...显示#}
3、slice切片
{{ navs|slice:"0:3" }}{# slice切片,两个参数 #}
4、upper大写、lower小写
{{ name|upper }} {# 大写 #}
{{ name|lower }} {# 小写 #}
5、join连接字符串
{{ navs|join:"====" }} {# 以","连接这个list#}
6、default默认值
{{ author |default:"管理员" }} {# default默认值 #}
7、时间格式化
{{ cur_time|date:'Y/m/d H:i:s' }} {# 时间格式化 #}
8、css注入、js注入
{{ h1_str |safe}}
{{ js_str|safe }}
{#如果后面加了safe的话,认为这个是安全的字符串,浏览器会按照标签解析#}
{#如果不加safe的话,就是一个普通的字符串,就不会按照标签解析#}
如果浏览器把所有标签都解析,那么很容易通过评论、提交等可以写入字符的地方进行css、js注入。
9、add加
{{ age|add:"1" }} {# add加,int类型做加法 #}
{{ name|add:" 先生"|upper }} {# 字符串类型,把两个字符串拼在一起 #}
PS:支持链式操作,使用多个管道符|
10、length取长度
{{ navs|length }}{# 取长度 #}
11、取下标元素
{{navs.0}} {# 取第0个元素 #}
二、自定义tag
前端实现自定义函数有两种方式,filter和simple_tag
准备工作:
1、在应用目录下创建templatetags目录,必需是pathon package模式的文件目录
2、在templatetags目录下创建py文件,并导入template模块
1、filter
自定义filter最多两个参数
- 替换敏感词--替换字符串后台写死
from django import template #导入template模块
register = template.Library() #这个变量必须叫register
# 加上这个就是装饰器
@register.filter
def mingan(value:str):
if '敏感词' in value:
value = value.replace("敏感词","**")
return value
#前端使用
{{ article_content2|mingan }} {# mingan是后台自定义的过滤函数 #}
- 替换敏感词--前端传入替换字符串
@register.filter def mingan2(value,s):#函数传入替换字符串s if '敏感词' in value: value = value.replace("敏感词",s) return value #前端代码 {{ article_content2|mingan2:"+++" }} {# 传入替换的字符 #}
2、simple_tag
simple_tag可实现多个参数
#不限制参数个数,传入一个list @register.simple_tag def mingan3(value,*args): for s in args: if s in value: value = value.replace(s,'**') return value #前端调用代码 {% mingan3 say "天黑" "星星" "月亮" "二维"%} {#调用simple_tag格式#}