十、前端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格式#}                      
posted @ 2019-11-01 14:47  颜颜blog  阅读(874)  评论(0编辑  收藏  举报