前言
不得不说django自带的过滤器很好用,虽然并不是所有的过滤器每次都在模板里面用得着,但是我觉得也可以把这些过滤器看作是工具函数一样。如果在编写代码时引用这些过滤器,可以方便我们实现一些逻辑,这样也避免重复造轮子。
使用方式
模板下使用
{{ 【变量名】|【过滤器名】:【参数1】 【参数2】}}
代码里使用
from django.template.defaultfilters import *
默认过滤器
- addslashes(value)
引号加上转义号>>>addslashes('') '' >>>addslashes('') ''
- capfirst(value)
第一个字母大写>>>capfirst("abcd") Abcd
- escapejs_filter(value)
替换value中的某些字符,以适应HTML格式。>>>escapejs_filter('') '\\u003Cscript\\u003Econsole.log(\\u002221312\\u0022)\\u003C/script\\u003E'
- json_script(value, element_id)
将json类型的value转换成json字符串包裹再标签里面,同时还可以根据element_id指定标签的属性id。
>>>json_script('{"username":"zhangsan"}',"test") ''
- floatformat(text, arg=-1)
四舍五入的格式化浮点数,默认保留1位小数,也可传递arg值来控制保留的小数位数,arg支持正数与负数。>>>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,该操作就不会再起作用。>>>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表示是否开启转义。>>>poem=""" 白日依山尽, 黄河入海流。 欲穷千里目, 更上一层楼。""" >>>linenumbers(poem) '1. 白日依山尽, 2. 黄河入海流。 3. 欲穷千里目, 4. 更上一层楼。' >>>linenumbers("") '1. <script>alert(123);</script>' >>>linenumbers("",False) '1. '
- lower(value)
将一个字符串转换成小写形式>>>lower("ABcd") 'abcd'
- make_list(value)
将value转换成一个list,对于字符串,转换成字符list;对于整数,转换成整数list>>>make_list(123) ['1', '2', '3'] >>>make_list("world") ['w', 'o', 'r', 'l', 'd']
- slugify(value)
将value转换成小写形式,同时删除所有分单词字符,并将空格变成横线。从下面可以看出对英文友好,中文无法实现,且最好都是空格隔开。>>>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格式,说白了就是首个字母大写。>>>title("aadsdada") 'Aadsdada'
upper(value)
将一个英文字符串转换成大写形式>>>upper("adad") 'ADAD'
urlencode(value, safe=None)
将一个字符串进行URLEncode,safe可以指定哪些字符不必被转义。>>>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表示是否开启转义。>>>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成特定的长度,后面以…显示。>>>urlizetrunc("点击 www.csdn.net 跳转到CSDN",5) '点击 www.… 跳转到CSDN'
- wordcount(value)
返回英文字符串中单词的数目(对英文友好)>>>wordcount("我和你") 1 >>>wordcount("good good study day day up") 6
- wordwrap(value, arg)
按照arg指定的长度包装字符串>>>wordwrap("Joel is a slug",5) 'Joel is a slug'
- ljust(value, arg):
输出arg指定长度的字符串左对齐,其它用空格填充>>>ljust("世俗之人看上去都能明明白白的事情",20) '世俗之人看上去都能明明白白的事情 '
- rjust(value, arg)
输出arg指定长度的字符串右对齐,其它用空格填充>>>rjust("世俗之人看上去都能明明白白的事情",20) ' 世俗之人看上去都能明明白白的事情'
- center(value, arg)
输出arg指定长度的字符串居中对齐,其它用空格填充center("世俗之人看上去都能明明白白的事情",20) ' 世俗之人看上去都能明明白白的事情 '
- cut(value, arg)
从给定value中删除所有arg的值>>>cut('白日依山尽',"尽") '白日依山'
- escape_filter(value)
替换value中的某些字符,以适应HTML格式,这个过滤器仅仅在输出的时候才起作用,所以escape不能够用在链式过滤器的中间,它应该总是最后一个过滤器,如果想在链式过滤器的中间使用,那么可以使用force_escape>>>escape_filter("") '<script>console.log(document.cookie);</script>'
- force_escape(value)
替换value中的某些字符,以适应HTML格式>>>force_escape("") '<script>console.log(document.cookie);</script>'
- linebreaks_filter(value, autoescape=True)
value中的”\n”将被\
替代,并且整个value使用\包围起来,从而适和HTML的格式代,如果内容包含标签会被转义,可以指定autoescape来确定是否转义。>>>linebreaks_filter("白日依山尽,\n黄河入海流。") '
白日依山尽,
' >>>linebreaks_filter("
黄河入海流。白日依山尽,\n黄河入海流。
") '<p>白日依山尽,
'
黄河入海流。</p> - linebreaksbr(value, autoescape=True)
value中的”\n”将被\
替代,如果内容包含标签会被转义,可以指定autoescape来确定是否转义。>>>linebreaksbr("白日依山尽,\n黄河入海流。") '白日依山尽,
黄河入海流。' - safe(value)
返回没有经过escape转换的value>>>safe("") ''
- safeseq(value)
与上述safe基本相同,但有一点不同的就是:safe是针对字符串,而safeseq是针对多个字符串组成的sequence。>>>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标签>>>striptags("
adddbbbbb
") 'adddbbbbb' dictsort(value, arg)
如果value的值是一个字典,那么返回值是按照关键字排序的结果>>>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’。>>>first([1,2,3]) 1
- join(value, arg, autoescape=True)
使用指定的字符串连接一个list,作用如同python的str.join(list)>>>join([1,2,3],"/") '1/2/3'
- last(value)
返回列表中的最后一个元素>>>last([1,2,3]) 3
- length(value)
返回value的长度>>>len("123456") 6
- length_is(value, arg)
如果value的长度等于arg的时候,则返回True。length_is("abcdefg",4) False length_is("abcdefg",7) True
- random(value)
从给定的list中返回一个任意的元素random(['a','b','c']) 'b'
- slice_filter(value, arg)
与python语法中的slice相同,arg表示截取到第几个元素。slice_filter("abcdefg",2) 'ab'
- unordered_list(value, autoescape=True)
将一个列表转化成无序列表的树形html结构>>>unordered_list(['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']])
- States
- Kansas
- Lawrence
- Topeka
- Illinois
- States
- add(value, arg)
将value的值和arg值相加>>>add(1,2) 3
- get_digit(value, arg)
根据arg来返回value里面从右边数的第arg个值。>>>get_digit(123456,1) 6 >>>get_digit(123456,6) 1 >>>get_digit(123456,7) 0
- date(value, arg=None)
根据指定日期格式arg来格式化日期>>>from datetime import datetime >>>date(datetime.now(),'Y-m-d') '2020-07-29'
- time(value, arg=None)
根据指定时间格式arg来格式化时间>>>from datetime import datetime >>>date(datetime.now(),'Y-m-d Hs') '2020-07-29 11:07:56'
timesince_filter(value, arg=None)
返回从value到arg经过的天数和小时数,需要区分两个时间的先后顺序,value是过去的时间,若arg未指定则默认当前时间。>>>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是未来时间。>>>from datetime import datetime,timedelta >>>tomorrow=datetime.now()+timedelta(days=1) >>>timeuntil_filter(tomorrow) '23\xa0小时,59\xa0分钟'
- default(value, arg)
如果value的意义是False,那么输出使用缺省值。>>>default(value=None,arg="缺省值") '缺省值' >>>default(value="",arg="缺省值") '缺省值'
- default_if_none(value, arg):
如果value是None,那么输出将使用缺省值。与上面的区别,该函数仅仅只会判断value是否为None。>>>default_if_none(value=None,arg="缺省值") '缺省值' >>>default_if_none(value="",arg="缺省值") ''
divisibleby(value, arg)
如果value能够被arg整除,那么返回值将是True。>>>divisibleby(6,2) True >>>divisibleby(2,6) False
yesno(value, arg=None)
将布尔变量转换为字符串yes(默认), no(默认)或maybe(默认),同时可以指定arg参数控制返回结果。yesno(True,"ok,no,maybe") 'ok' yesno(False,"ok,no,maybe") 'no' yesno(None,"ok,no,maybe") 'maybe'
- filesizeformat(bytes_)
格式化value,使其成为易读的文件大小。>>>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’。>>>"vote"+pluralize(1) 'vote' >>>"vote"+pluralize(2) 'votes' >>>"class"+pluralize(1,"es") 'class' >>>"class"+pluralize(2,"es") 'classes'
- phone2numeric_filter(value)
数字和字母字符串可以转换为数字?纳尼>>>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标签(闭合和未闭合情况下)只会视为一个字符>>> from django.template.defaultfilters import truncatechars,truncatechars_html >>> truncatechars("白日依山尽,黄河入海流。",5) '白日依山尽' >>> truncatechars_html("白日依山",5) "白日依山" >>>truncatechars_html("白日依山",5) "白日依山"
- truncatewords和truncatewords_html
truncatewords和truncatewords_html只适合英文进行切割,因为英文习惯会空格,正是因为根据空格来进行切割生成列表。
中文下
英文下>>> from django.template.defaultfilters import truncatechars,truncatechars_html >>> truncatewords("白日依山尽,黄河入海流。",5) '白日依山尽,黄河入海流。' >>> truncatewords("白日依山尽",3) '白日依山尽' >>> truncatewords("白 日 依 山 尽",3) '白 日 依 …'
>>> 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.属性|过滤器 }}
来使用项目里面使用导入该模块里面的函数,调用函数即可
from django.contrib.humanize.templatetags.humanize import *
apnumber(value)
对于数字1~9,你可以传递整数,或者整数的字符串形式。返回数字的英文形式。否则返回数字本身。由于django支持国际化,当在settings里面设置了LANGUAGE_CODE = 'zh-Hans'
,则输出内容会被翻译成中文如“一”>>>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):
你可以传递整数,或者整数的字符串形式。将整数转化为字符串,每三位之间带一个逗号。>>>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'
,则输出内容会被翻译成中文如“百万”>>>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 设置>>>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'
,下方的内容会被翻译成几秒前、几小时前,几天后等。>>>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'
,下方的内容会被翻译成第一,第二,第三等。>>>ordinal(1) '1st' >>>ordinal(2) '2nd' >>>ordinal('3') '4rd' >>>ordinal(5) '5th'