Django提供了一些函数,经过前端能够实现代码逻辑、字符串的处理等功能,一些复杂的功能如数据合法性判断、非法字符的过滤等能够经过后台代码实现前端自定义函数。css
django提供了两种方法为前端实现自定义函数,分别是filter和simple_tag.
html
1、前端tag前端
后台代码django
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>
一、前端使用变量
{{ age }} {#后端的变量使用两个大括号括起来,可直接使用#}
二、truncatechars截断字符串
{{ article_content|truncatechars:"20" }} {#truncatechars 截断字符串,只显示20个,多余的字符串用...显示#}
三、slice切片
{{ navs|slice:"0:3" }}{# slice切片,两个参数 #}
四、upper大写、lower小写
{{ name|upper }} {# 大写 #}
{{ name|lower }} {# 小写 #}
五、join链接字符串
{{ navs|join:"====" }} {# 以","链接这个list#}
六、default默认值
{{ author |default:"管理员" }} {# default默认值 #}
七、时间格式化
{{ cur_time|date:'Y/m/d H:i:s' }} {# 时间格式化 #}
八、css注入、js注入
{{ h1_str |safe}}
{{ js_str|safe }}
{#若是后面加了safe的话,认为这个是安全的字符串,浏览器会按照标签解析#}
{#若是不加safe的话,就是一个普通的字符串,就不会按照标签解析#}
若是浏览器把全部标签都解析,那么很容易经过评论、提交等能够写入字符的地方进行css、js注入。
九、add加
{{ age|add:"1" }} {# add加,int类型作加法 #}
{{ name|add:" 先生"|upper }} {# 字符串类型,把两个字符串拼在一块儿 #}
PS:支持链式操做,使用多个管道符|
十、length取长度
{{ navs|length }}{# 取长度 #}
十一、取下标元素
{{navs.0}} {# 取第0个元素 #}
2、自定义tag
前端实现自定义函数有两种方式,filter和simple_tag
准备工做:
一、在应用目录下建立templatetags目录,必需是pathon package模式的文件目录
二、在templatetags目录下建立py文件,并导入template模块
一、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:"+++" }} {# 传入替换的字符 #}
二、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格式#}