盘点常用的Django框架过滤器
过滤器:(Filters)
常用过滤器介绍:
在Django的模板语言中,通过使用过滤器来改变变量的显示。
过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。
这里的过滤的意思实际上个人认为概念很模糊,过滤器的意思是将变量通过使用后端的方法将变量进行相关操作加工逻辑处理的封装之后拿到前端去使用的一种过程实现。
例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。
注意事项:
##过滤器支持链式操作,即一个过滤器的输出结果作为另一个过滤器的输入
##过滤器可以接收参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
##过滤器参数包含空格的话,必须用引号包裹起来,比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
##管道符‘|’左右没有空格。一定要注意,没有空格
Django的模板语言中提供了大约六十个内置过滤器。这里主要拿出一些常见的方法来介绍:
#default
如果一个变量是false或空,使用给定的默认值,否则使用该变量的值。
{{ value|default:"nothing"}} 如果value没有传值或者值为空的话就显示nothing
#length
返回值的长度,作用于字符串和列表
{{ value|length }} 后端: s = 'what f**k!' l = ['a', 'b', 4, 5, 8] 前端: {{ l|length }} {{ s|length }}
显示结果:
5 10
#filesizeformat
将值格式化为一个可理解的文件大小单位(13kb,4m)
{{ value|filesizeformat }} 后端: n = 102478450 前端: {{ n|filesizeformat }}
显示结果:
97.7 MB
#slice 切片(顾头不顾尾)
{{value|slice:"开始索引:结束索引:步长"}} 后端: s = 'what f**k!' l = ['a', 'b', 4, 5, 8] 前端: {{ l|slice:'1:4' }} {{ s|slice:'5:9' }} {{ l|slice:'2:-1' }} <!--从索引2开始切,切到索引为-1的位置为结尾,同时顾头不顾尾-->
显示结果:
['b', 4, 5] f**k [4, 5]
#date 时间格式化输出
{{ value|date:"Y-m-d H:i:s"}} 后端: import datetime ctime = datetime.datetime.now() 前端: {{ ctime }} {{ ctime|date:'Y-m-d H:i:s' }}
显示结果:
June 11, 2019, 2:51 p.m. 2019-06-11 14:51:24
#safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。
后端: value = "<a href='https://www.cnblogs.com/suguangti/'>点我</a>" 前端: {{ value }} {{ value|safe }}
结果:
<a href='https://www.cnblogs.com/suguangti/'>点我</a> 点我 下面那个‘点我’在页面上是一个a标签,点击可跳转
上面的safe是在前端取消转义,后端取消转义方法如下:
from django.utils.safestring import mark_safe xxx = mark_safe('<h1>我是h1标签</h1>')
相关推荐:《》
#truncatechars
如果字符串字符多于指定的字符数量,那么会被截断,截断的剩余字符将用省略号结尾表示。
参数:截断的字符数(包含三个点)
后端: ss = 'abcdefghijklmnopqrstuvwxyz' 前端: {{ ss|truncatechars:10 }}
结果:(注意...也算进长度里了)
abcdefg...
#truncatewords
以一个单词为一个元素,单词与单词之间的空格为区分依据,将一定数量的单词进行截断,截断后面的用...表示
一个单词加上一个空格 计数一个。
后端: sss = "Life was like a box of chocolates you never know what you're gonna get." 前端: {{ sss|truncatewords:7 }}
显示结果:
Life was like a box of chocolates ... (注意chocolates后面有个空格)
#cut
移除变量中所有的指定相同的字符串
{{ value|cut:' ' }} 后端: ssss = 'you do bb now,bb is not good thing, why do you bb for too many times!' 前端: {{ ssss|cut:'bb' }}
显示结果:
you do now, is not good thing, why do you for too many times!
#join
将列表中的元素用指定字符连接起来
后端 ll = [1, 2, 3, 4, 5] 前端 {{ ll|join:'@' }}
结果
1@2@3@4@5
标签介绍:
#for循环(内部有个empty判断,详见下面if判断示例)
后端 ll = [1, 2, 3, 4, 5] 前端 {% for foo in ll %} <p>{{ foo }}</p> {% endfor %}
结果显示:
1 2 3 4 5
forloop的使用:
后端 ll = [1, 2, 3, 4, 5] 前端 {% for foo in ll %} <p>{{ forloop }}</p> {% endfor %}
forlop里面有几个属性需要我们注意,比如 counter0,counter,first,last它们对应的值在for循环过程中的开始和结束是不一样的
#if 判断
{% for foo in l %} if else {% if flag %} <p>flag不为空</p> {% else %} <p>flag是空</p> {% endif %} {#(l = ['a', 'b', 'c', 'd', 'e'])#} {% for foo in l %} {% if forloop.first %} <p>这是我的第一次</p> {% elif forloop.last %} <p>这是最后一次了啊</p> {% else %} <p>嗨起来!!!</p> {% endif %} {% empty %} <!--如果l = [],上面的for循环不会进行,只会走这一步--> <p>你给我的容器类型是个空啊,没法for循环</p> {% endfor %}
l = ['a', 'b', 'c', 'd', 'e'] 这是我的第一次 嗨起来!!! 嗨起来!!! 嗨起来!!! 这是最后一次了啊 l = [] 你给我的容器类型是个空啊,没法for循环
3.自定义过滤器/标签/inclusion_tag:
必须做的三件事
1.在应用名下新建一个名为templatetags文件夹(必须叫这个名字)
2.在该新建的文件夹内新建一个任意名称的py文件
3.在该py文件中需要固定写下面两句代码
①这里在app01项目程序文件夹新建templatetags文件夹,在此文件夹内新建一个mine.py文件,打开mine.py文件>>输入:
from django import template register = template.Library() # 自定义过滤器 @register.filter(name='my_filter') def index(a, b): return a*b # 自定义标签: @register.simple_tag def plus(a, b, c): return a+b+c
②前端html文件内使用过滤器或者标签:
{% load mine %} <!-- 要使用自定义过滤器和标签,需要先加载自己定义的文件 --> {{ 9|my_filter:11 }} <!-- 使用自定义过滤器,注意这里需要用name的值作为使用方法 --> {% my_tag 1 2 3 %} <!-- 使用自定义标签,注意这里需要用name的值作为使用方法 -->
显示的结果:
99 6
自定义inclusion_tag
inclusion_tag的作用:创建一个动态的html页面文件a.html,这个页面文件a可以在另外一个页面b中被调用,实现这个页面a应该有的功能。比如:
在上面的mine.py文件中创建inclusion_tag:
# mine.py文件 创建inclusion_tag from app01 import models from django import template register = template.Library() @register.inclusion_tag('inclusion_t_test.html', name='my_inclusion') def func(): book_list = models.Book.objects.all() return {'list': book_list} #将book_list的QuerySet对象列表传进inclusion_t_test.html文件
inclusion_t_test.html文件里面:
<!-- inclusion_t_test.html文件,被导入的html文件--> <table> <thead> <tr> <th>id</th> <th>title</th> <th>price</th> </tr> </thead> <tbody> {% for obj in list %} <tr> <td>{{ obj.id }}</td> <td>{{ obj.title }}</td> <td>{{ obj.price }}</td> </tr> {% endfor %} </tbody> </table>
调用的html页面文件:
{% load mine %} <!-- 必须要先加载创建标签的文件--> {% my_inclusion %} <!-- 调用inclusion_t_test.html页面文件,这里使用该标签的name来调用-->