盘点django的过滤器,盘它! 2020年07月30日 未雨晴空 0评论 307阅读 0喜欢 阅读模式 隐藏边栏 显示边栏 ## 前言 >不得不说django自带的过滤器很好用,虽然并不是所有的过滤器每次都在模板里面用得着,但是我觉得也可以把这些过滤器看作是工具函数一样。如果在编写代码时引用这些过滤器,可以方便我们实现一些逻辑,这样也避免重复造轮子。 ## 使用方式 * 模板下使用 ```python {{ 【变量名】|【过滤器名】:【参数1】 【参数2】}} ``` * 代码里使用 ```python from django.template.defaultfilters import * ``` ## 默认过滤器 * addslashes(value) 引号加上转义号 ```python >>>addslashes('') '' >>>addslashes('') '' ``` * capfirst(value) 第一个字母大写 ```python >>>capfirst("abcd") Abcd ``` * escapejs_filter(value) 替换value中的某些字符,以适应HTML格式。 ```python >>>escapejs_filter('') '\\u003Cscript\\u003Econsole.log(\\u002221312\\u0022)\\u003C/script\\u003E' ``` * json_script(value, element_id) 将json类型的value转换成json字符串包裹再``标签里面,同时还可以根据element_id指定标签的属性id。 ```python >>>json_script('{"username":"zhangsan"}',"test") '' ``` * floatformat(text, arg=-1) 四舍五入的格式化浮点数,默认保留1位小数,也可传递arg值来控制保留的小数位数,arg支持正数与负数。 ```python >>>floatformat(34.23234) '34.2' >>>floatformat(34.0000) '34' >>>floatformat(34.26000) '34.3' >>>floatformat(34.23234,3) '34.232' >>>floatformat(34.23,3) '34.230' >>>floatformat(34.23234,-3) '34.232' >>>floatformat(34.23,-3) '34.230' ``` * iriencode(value) 如果value中有非ASCII字符,那么将其进行转化成URL中适合的编码,如果value已经进行过urlencode,该操作就不会再起作用。 ```python >>>iriencode("https://www.example.com?name=张三") 'https://www.example.com?name=%E5%BC%A0%E4%B8%89' >>>iriencode("https://www.example.com?name=%E5%BC%A0%E4%B8%89") 'https://www.example.com?name=%E5%BC%A0%E4%B8%89' ``` * linenumbers(value, autoescape=True) 使显示的文本,带有行数。autoescape表示是否开启转义。 ```python >>>poem=""" 白日依山尽, 黄河入海流。 欲穷千里目, 更上一层楼。""" >>>linenumbers(poem) '1. 白日依山尽, 2. 黄河入海流。 3. 欲穷千里目, 4. 更上一层楼。' >>>linenumbers("") '1. <script>alert(123);</script>' >>>linenumbers("",False) '1. ' ``` * lower(value) 将一个字符串转换成小写形式 ```python >>>lower("ABcd") 'abcd' ``` * make_list(value) 将value转换成一个list,对于字符串,转换成字符list;对于整数,转换成整数list ```python >>>make_list(123) ['1', '2', '3'] >>>make_list("world") ['w', 'o', 'r', 'l', 'd'] ``` * slugify(value) 将value转换成小写形式,同时删除所有分单词字符,并将空格变成横线。从下面可以看出对英文友好,中文无法实现,且最好都是空格隔开。 ```python >>>slugify("good good study,day day up") 'good-good-studyday-day-up' >>>slugify("good good study day day up") 'good-good-study-day-day-up' >>>slugify("好好学习,天天向上") '' ``` * title(value) 转换一个英文字符串成为title格式,说白了就是首个字母大写。 ```python >>>title("aadsdada") 'Aadsdada' ``` * upper(value) 将一个英文字符串转换成大写形式 ```python >>>upper("adad") 'ADAD' ``` * urlencode(value, safe=None) 将一个字符串进行URLEncode,safe可以指定哪些字符不必被转义。 ```python >>>urlencode("https://www.example.com?name='张三'") 'https%3A//www.example.com%3Fname%3D%27%E5%BC%A0%E4%B8%89%27' >>>urlencode("https://www.example.com?name='张三'","://") 'https://www.example.com%3Fname%3D%27%E5%BC%A0%E4%B8%89%27' ``` * urlize(value, autoescape=True) 将一个字符串中的URL转化成可点击的形式,需要注意的是链接和正文需要空格分开,autoescape表示是否开启转义。 ```python >>>urlize("点击www.csdn.net跳转到CSDN") '点击www.csdn.net跳转到CSDN' >>>urlize("点击 www.csdn.net 跳转到CSDN") '点击 www.csdn.net 跳转到CSDN' ``` * urlizetrunc(value, limit, autoescape=True) 与上面的urlize功能相似但是有一点不同就是现实的链接字符会被truncate成特定的长度,后面以...显示。 ```python >>>urlizetrunc("点击 www.csdn.net 跳转到CSDN",5) '点击 www.… 跳转到CSDN' ``` * wordcount(value) 返回英文字符串中单词的数目(对英文友好) ```python >>>wordcount("我和你") 1 >>>wordcount("good good study day day up") 6 ``` * wordwrap(value, arg) 按照arg指定的长度包装字符串 ```python >>>wordwrap("Joel is a slug",5) 'Joel is a slug' ``` * ljust(value, arg): 输出arg指定长度的字符串左对齐,其它用空格填充 ```python >>>ljust("世俗之人看上去都能明明白白的事情",20) '世俗之人看上去都能明明白白的事情 ' ``` * rjust(value, arg) 输出arg指定长度的字符串右对齐,其它用空格填充 ```python >>>rjust("世俗之人看上去都能明明白白的事情",20) ' 世俗之人看上去都能明明白白的事情' ``` * center(value, arg) 输出arg指定长度的字符串居中对齐,其它用空格填充 ```python center("世俗之人看上去都能明明白白的事情",20) ' 世俗之人看上去都能明明白白的事情 ' ``` * cut(value, arg) 从给定value中删除所有arg的值 ```python >>>cut('白日依山尽',"尽") '白日依山' ``` * escape_filter(value) 替换value中的某些字符,以适应HTML格式,这个过滤器仅仅在输出的时候才起作用,所以escape不能够用在链式过滤器的中间,它应该总是最后一个过滤器,如果想在链式过滤器的中间使用,那么可以使用force_escape ```python >>>escape_filter("") '<script>console.log(document.cookie);</script>' ``` * force_escape(value) 替换value中的某些字符,以适应HTML格式 ```python >>>force_escape("") '<script>console.log(document.cookie);</script>' ``` * linebreaks_filter(value, autoescape=True) value中的"\n"将被\替代,并且整个value使用\包围起来,从而适和HTML的格式代,如果内容包含标签会被转义,可以指定autoescape来确定是否转义。 ```python >>>linebreaks_filter("白日依山尽,\n黄河入海流。") '白日依山尽,黄河入海流。' >>>linebreaks_filter("白日依山尽,\n黄河入海流。") '<p>白日依山尽,黄河入海流。</p>' ``` * linebreaksbr(value, autoescape=True) value中的"\n"将被\替代,如果内容包含标签会被转义,可以指定autoescape来确定是否转义。 ```python >>>linebreaksbr("白日依山尽,\n黄河入海流。") '白日依山尽,黄河入海流。' ``` * safe(value) 返回没有经过escape转换的value ```python >>>safe("") '' ``` * safeseq(value) 与上述safe基本相同,但有一点不同的就是:safe是针对字符串,而safeseq是针对多个字符串组成的sequence。 ```python >>>safeseq("") ['<', 's', 'c', 'r', 'i', 'p', 't', '>', 'c', 'o', 'n', 's', 'o', 'l', 'e', '.', 'l', 'o', 'g', '(', '1', '2', '1', '2', ')', ';', '<', '/', 's', 'c', 'r', 'i', 'p', 't', '>'] ``` * striptags(value) 删除value中的所有HTML标签 ```python >>>striptags("adddbbbbb") 'adddbbbbb' ``` * dictsort(value, arg) 如果value的值是一个字典,那么返回值是按照关键字排序的结果 ```python >>>dictsort([{'name': 'zed', 'age': 39},{'name': 'amy', 'age': 22},{'name': 'joe', 'age': 11},],'name') [{'name': 'amy', 'age': 22}, {'name': 'joe', 'age': 11}, {'name': 'zed', 'age': 39}] >>>dictsort([{'name': 'zed', 'age': 39},{'name': 'amy', 'age': 22},{'name': 'joe', 'age': 11},],'age') [{'name': 'joe', 'age': 11}, {'name': 'amy', 'age': 22}, {'name': 'zed', 'age': 39}] ``` * first(value) 返回列表中的第一个元素,例如,如果value是列表['a','b','c'],那么输出将是'a'。 ```python >>>first([1,2,3]) 1 ``` * join(value, arg, autoescape=True) 使用指定的字符串连接一个list,作用如同python的str.join(list) ```python >>>join([1,2,3],"/") '1/2/3' ``` * last(value) 返回列表中的最后一个元素 ```python >>>last([1,2,3]) 3 ``` * length(value) 返回value的长度 ```python >>>len("123456") 6 ``` * length_is(value, arg) 如果value的长度等于arg的时候,则返回True。 ```python length_is("abcdefg",4) False length_is("abcdefg",7) True ``` * random(value) 从给定的list中返回一个任意的元素 ```python random(['a','b','c']) 'b' ``` * slice_filter(value, arg) 与python语法中的slice相同,arg表示截取到第几个元素。 ```python slice_filter("abcdefg",2) 'ab' ``` * unordered_list(value, autoescape=True) 将一个列表转化成无序列表的树形html结构 ```python >>>unordered_list(['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]) States Kansas Lawrence Topeka Illinois ``` * add(value, arg) 将value的值和arg值相加 ```python >>>add(1,2) 3 ``` * get_digit(value, arg) 根据arg来返回value里面从右边数的第arg个值。 ```python >>>get_digit(123456,1) 6 >>>get_digit(123456,6) 1 >>>get_digit(123456,7) 0 ``` * date(value, arg=None) 根据指定日期格式arg来格式化日期 ```python >>>from datetime import datetime >>>date(datetime.now(),'Y-m-d') '2020-07-29' ``` * time(value, arg=None) 根据指定时间格式arg来格式化时间 ```python >>>from datetime import datetime >>>date(datetime.now(),'Y-m-d H:m:s') '2020-07-29 11:07:56' ``` * timesince_filter(value, arg=None) 返回从value到arg经过的天数和小时数,需要区分两个时间的先后顺序,value是过去的时间,若arg未指定则默认当前时间。 ```python >>>from datetime import datetime,timedelta >>>now=datetime.now() >>>ago=now-timedelta(hours=4) >>>datetime.datetime(2020, 7, 29, 7, 24, 44, 193135) >>>timesince_filter(ago,now) '4 小时' ``` * timeuntil_filter(value, arg=None) 从arg到value经过了多少时间,与上面的区别在于2个日期的前后位置,即arg是过去时间,若arg未指定则默认当前时间。value是未来时间。 ```python >>>from datetime import datetime,timedelta >>>tomorrow=datetime.now()+timedelta(days=1) >>>timeuntil_filter(tomorrow) '23\xa0小时,59\xa0分钟' ``` * default(value, arg) 如果value的意义是False,那么输出使用缺省值。 ```python >>>default(value=None,arg="缺省值") '缺省值' >>>default(value="",arg="缺省值") '缺省值' ``` * default_if_none(value, arg): 如果value是None,那么输出将使用缺省值。与上面的区别,该函数仅仅只会判断value是否为None。 ```python >>>default_if_none(value=None,arg="缺省值") '缺省值' >>>default_if_none(value="",arg="缺省值") '' ``` * divisibleby(value, arg) 如果value能够被arg整除,那么返回值将是True。 ```python >>>divisibleby(6,2) True >>>divisibleby(2,6) False ``` * yesno(value, arg=None) 将布尔变量转换为字符串yes(默认), no(默认)或maybe(默认),同时可以指定arg参数控制返回结果。 ```python yesno(True,"ok,no,maybe") 'ok' yesno(False,"ok,no,maybe") 'no' yesno(None,"ok,no,maybe") 'maybe' ``` * filesizeformat(bytes_) 格式化value,使其成为易读的文件大小。 ```python >>>filesizeformat(1024) '1.0 KB' >>>filesizeformat(1024*30) '30.0 KB' >>>filesizeformat(1024*1024) '1.0 MB' >>>filesizeformat(1024*1024*1024) '1.0 GB' ``` * pluralize(value, arg='s') 如果value不是1,则返回一个复数后缀,如果没用指定arg的值,则默认缺省的后缀是's'。 ```python >>>"vote"+pluralize(1) 'vote' >>>"vote"+pluralize(2) 'votes' >>>"class"+pluralize(1,"es") 'class' >>>"class"+pluralize(2,"es") 'classes' ``` * phone2numeric_filter(value) 数字和字母字符串可以转换为数字?纳尼 ```python >>>phone2numeric_filter("123456789") '123456789' >>>phone2numeric_filter("A") '2' >>>phone2numeric_filter("a") '2' >>>phone2numeric_filter("abcdefghijklmnopqrstuvwxyz") '22233344455566677778889999' ``` * pprint(value) 转换为用以调试的过滤器,主要是将value变得输出更具美观。。。 * truncatechars和truncatechars_html truncatechars和truncatechars_html针对中英文都可以切割,且truncatechars_html在遇到html标签(闭合和未闭合情况下)只会视为一个字符 ```python >>> from django.template.defaultfilters import truncatechars,truncatechars_html >>> truncatechars("白日依山尽,黄河入海流。",5) '白日依山尽' >>> truncatechars_html("白日依山",5) "白日依山" >>>truncatechars_html("白日依山",5) "白日依山" ``` * truncatewords和truncatewords_html truncatewords和truncatewords_html只适合英文进行切割,因为英文习惯会空格,正是因为根据空格来进行切割生成列表。 **中文下** ```python >>> from django.template.defaultfilters import truncatechars,truncatechars_html >>> truncatewords("白日依山尽,黄河入海流。",5) '白日依山尽,黄河入海流。' >>> truncatewords("白日依山尽",3) '白日依山尽' >>> truncatewords("白 日 依 山 尽",3) '白 日 依 …' ``` **英文下** ```python >>> from django.template.defaultfilters import truncatechars,truncatechars_html >>> truncatewords("onetwothreefourfive",3) 'onetwothreefourfive' >>> truncatewords("one two three four five",3) 'one two three …' >>> truncatewords("day day up,good good study.",3) 'day day up,good …' >>> "day day up,good good study.".split() ['day', 'day', 'up,good', 'good', 'study.'] ``` ## 其他过滤器如humanize 这是django自带的一组模板过滤器, 可以为您的数据添加人性化选项。它用于将数字或者日期转化为人类友好可读的格式。 ### 使用方式 * 模板下使用 把`'django.contrib.humanize'`添加到**INSTALLED_APPS**设置来激活这些过滤器。然后在模板中使用`{% load humanize %}` 你就可以通过`{{ obj.属性|过滤器 }}`来使用 * 项目里面使用导入该模块里面的函数,调用函数即可 ```python from django.contrib.humanize.templatetags.humanize import * ``` * apnumber(value) 对于数字1~9,你可以传递整数,或者整数的字符串形式。返回数字的英文形式。否则返回数字本身。由于django支持国际化,当在settings里面设置了`LANGUAGE_CODE = 'zh-Hans'`,则输出内容会被翻译成中文如“一” ```python >>>print("0会变成:"+str(apnumber(0))+";类型为:"+str(type(apnumber(0)))) 0会变成:0;类型为: >>>print("1会变成:"+str(apnumber(1))+";类型为:"+str(type(apnumber(1)))) 1会变成:one;类型为: >>>print("9会变成:"+str(apnumber('9'))+";类型为:"+str(type(apnumber('9')))) 9会变成:九;类型为: >>>print("10会变成:"+str(apnumber(10))+";类型为:"+str(type(apnumber(10)))) 10会变成:10;类型为: ``` * intcomma(value, use_l10n=True): 你可以传递整数,或者整数的字符串形式。将整数转化为字符串,每三位之间带一个逗号。 ```python >>>intcomma(4500) '4,500' >>>intcomma('4500') '4,500' >>>intcomma('4500000') '4,500,000' >>>intcomma(45000) '45,000' ``` * intword(value) 将一个大的整数转化为友好的文字表示形式。适用于超过一百万的数字。支持高达10的100次方的整数。由于django支持国际化,当在settings里面设置了`LANGUAGE_CODE = 'zh-Hans'`,则输出内容会被翻译成中文如“百万” ```python >>>intword(1000000) '1.0 million' >>>intword('1200000') '1.2 million' >>>intword(1200000000) '1.2 billion' ``` * naturalday(value, arg=None) value是日期类型,arg是日期的格式字符串。对于当天或者一天之内的日期,由于django支持国际化,当在settings里面设置了`LANGUAGE_CODE = 'zh-Hans'`,则返回“今天”,“明天”或者“昨天”,否则返回"today","yesterday","tomorrow";如果超出一天则根据提供的格式字符串给日期格式化,如果没提供参数的话,将会按照**DATE_FORMAT** 设置 ```python >>>from django.contrib.humanize.templatetags.humanize import * >>>from datetime import datetime,timedelta >>>naturalday(datetime.now()) 'today' >>>naturalday(datetime.now()+timedelta(days=1)) 'tomorrow' >>>naturalday(datetime.now()-timedelta(days=1)) 'yesterday' >>>naturalday(datetime.now()+timedelta(days=2)) 'July 26, 2020' >>>naturalday(datetime.now()+timedelta(days=2),'Y-m-d') '2020-07-26' ``` * naturaltime(value) value表示日期类型的数据,如果是日期是字符串类型需要转化成日期。对于日期时间的值,返回一个字符串来表示多少秒、分钟或者小时之前。如果超过一天之前,如果是未来的日期时间,返回值会自动使用合适的文字表述。 由于django支持国际化,当在settings里面设置了`LANGUAGE_CODE = 'zh-Hans'`,下方的内容会被翻译成几秒前、几小时前,几天后等。 ```python >>>from django.contrib.humanize.templatetags.humanize import * >>>from datetime import datetime,timedelta >>>naturaltime(datetime.now()-timedelta(seconds=20)) '20 seconds ago' >>>naturaltime(datetime.now()-timedelta(minutes=2)) '2 minutes ago' >>>naturaltime(datetime.now()-timedelta(hours=2)) '2 hours ago' >>>naturaltime(datetime.now()-timedelta(days=2,hours=2)) '2 day, 2 hours ago' >>>naturaltime(datetime.now()-timedelta(weeks=3)) '3 weeks ago' >>>naturaltime(datetime.now()+timedelta(seconds=20)) '20 seconds from now' ... ``` * ordinal(value) value可以是整数,或者整数的字符串形式。将一个整数转化为它的序数词字符串;由于django支持国际化,当在settings里面设置了`LANGUAGE_CODE = 'zh-Hans'`,下方的内容会被翻译成第一,第二,第三等。 ```python >>>ordinal(1) '1st' >>>ordinal(2) '2nd' >>>ordinal('3') '4rd' >>>ordinal(5) '5th' ``` © 著作权归作者所有,欢迎转载,转载请说明出处:未雨晴空博客,谢谢理解! 喜欢 打赏 分享 上一篇 下一篇 发表评论 取消回复 电子邮件地址不会被公开。 表情 请输入以http或https开头的URL,格式如:https://oneisall.top 提交评论