有时后端返回的数据,需要前端处理,比如超过XX个字符展示...这种需求,就需要用到filter。django有自带的filter模块,也可以自己定义filter来过滤。

一、django自带filter:

views.py:

def test(request):
    import datetime
    cur_time=datetime.datetime.now()
    age = 18
    name = 'marry'
    article_content = 'django有自带的分页,非常的好用,代码如下:django有自带的分页,非常的好用,代码如下:django有自带的分页,非常的好用,代码如下:'
    navs = ["我的日记","我的相册",'我的心情','我的心情1','我的心情2','我的心情3']
    comments = "<h1 style='font-size:500px'>你好呀</h1>"
    h1_str = '<p style="font-size:98px">哈哈哈哈</p>'
    js_str="<script>alert('哈哈哈哈')</script>"
    article_content = "朝鲜一哥金三胖,已经登上太阳,为了避免太阳太热,选择晚上奔上太阳"
    say = "今天吃饭的时候,碰到一个傻x,那个家伙实在是太213了,公然插队,吃完饭在马路上随地大小便,够sb的。"
    return render(request,'test.html',locals())    #locals()就是把所有定义的变量返回

二、自定义filter:目录是  app模块下建一个放tags的目录。my_tags.html

目录结构:

 代码:

from django import template
#自定义tags。必须在user下创建一个python package,并且包名必须为“templatetags”
register=template.Library()  #register名字也是固定的
@register.filter(name='hm')    #这里的name是前端调用方法时的name,不加的话就是方法名#@register.filter()
def mingan(value):
    if "金三胖" in value:
        value=value.replace("金三胖","金正恩")
    return value

@register.filter()
def mingan2(value,s):    #前端传参,自定义filter最多只能两个参数
    if "金三胖" in value:
        value=value.replace("金三胖",s)
    return value


#simple tag:
@register.simple_tag    #simple_tag可以传多个参数
def mingan3(value,*args):
    for s in args:
        if s in value:
            value=value.replace(s,"**")
    return value

三、前端用自定义filter和自带filter的方式

{% load my_tags %}     #这里要引入自定义filter

{#引入自定义的tags#}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{{ age }}
{{ age|add:"1" }}
{#age的基础上加1#}
<br>
{{ name }}
{{ name |add:"先生"|upper}}
{#支持链式操作#}
<br>
{{ comments }}
{#{{ comments|safe }}#}
{#如果后边加了safe的话,认为这个是安全的字符串,浏览器会按照标签内容解析。容易造成CSS注入,所以当不需要浏览器解析标签时,就不要加safe#}
<br>
{{ article_content|truncatechars:"20" }}
{#截断字符串的,多余的字符串用...显示#}
<br>

{{ navs|slice:"0:3" }}
{#切片#}
<br>
{{ navs.0 }}
{#获取第0个元素#}
<br>
{{ navs|length }}
{#获取长度#}
<br>
{{ navs|join:"====" }}
{#拼接#}
<br>
{{ author |default:"管理员" }}
<br>
{{ cur_time|date:'Y/m/d H:i:s' }}
<br>
{{ js_str }}
{#{{ js_str|safe }}#}
{#如果后边加了safe的话,认为这个是安全的字符串,浏览器会按照标签内容解析。容易造成JS注入#}
<br>
{{ article_content|hm }}
{{ article_content|mingan2:'金胖子' }}
{#register.filter 用法#}
{#用法#}
<br>
{% mingan3 say "213" "sb" "傻x"%}
{#simple tag 用法#}

<br>
{{ name|lower }}

</body>
</html>

四、urls.py中urlpatterns  加上“path('test/', views.test),”

然后运行django工程,访问127.0.0.1:8000/test。样式应该如下图

12-30 00:58