django笔记——过滤器

前言

不得不说django自带的过滤器很好用,虽然并不是所有的过滤器每次都在模板里面用得着,但是我觉得也可以把这些过滤器看作是工具函数一样。如果在编写代码时引用这些过滤器,可以方便我们实现一些逻辑,这样也避免重复造轮子。?

使用方式

  • 模板下使用

    {{ 【变量名】|【过滤器名】:【参数1】 【参数2}}
    
  • 代码里使用

    from django.template.defaultfilters import  *
    

默认过滤器

  • addslashes(value)
    引号加上转义号

    >>>addslashes('<p class="title"></p>')
    '<p class=\\"title\\"></p>'
    >>>addslashes('<p class=\\"title\\"></p>')
    '<p class=\\\\\\"title\\\\\\"></p>'
    
  • capfirst(value)
    第一个字母大写

    >>>capfirst("abcd")
    Abcd
    
  • escapejs_filter(value)
    替换value中的某些字符,以适应HTML格式。

    >>>escapejs_filter('<script>console.log("21312")</script>')
    '\\u003Cscript\\u003Econsole.log(\\u002221312\\u0022)\\u003C/script\\u003E'
    
  • json_script(value, element_id)
    将json类型的value转换成json字符串包裹再<script type="application/json" id=element_id></script>标签里面,同时还可以根据element_id指定标签的属性id。

    >>>json_script('{"username":"zhangsan"}',"test")
    '<script id="test" type="application/json">"{username:\\"zhangsan\\"}"</script>'
    
  • 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("<script>alert(123);</script>")
    '1. &lt;script&gt;alert(123);&lt;/script&gt;'
    >>>linenumbers("<script>alert(123);</script>",False)
    '1. <script>alert(123);</script>'
    
  • 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")
    '点击 <a href="http://www.csdn.net" rel="nofollow">www.csdn.net</a> 跳转到CSDN'
    
  • urlizetrunc(value, limit, autoescape=True)
    与上面的urlize功能相似但是有一点不同就是现实的链接字符会被truncate成特定的长度,后面以…显示。

    >>>urlizetrunc("点击 www.csdn.net 跳转到CSDN",5)
    '点击 <a href="http://www.csdn.net" rel="nofollow">www.…</a> 跳转到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>")
    '&lt;script&gt;console.log(document.cookie);&lt;/script&gt;'
    
  • force_escape(value)
    替换value中的某些字符,以适应HTML格式

    >>>force_escape("<script>console.log(document.cookie);</script>")
    '&lt;script&gt;console.log(document.cookie);&lt;/script&gt;'
    
  • linebreaks_filter(value, autoescape=True)
    value中的"\n"将被<br/>替代,并且整个value使用</p>包围起来,从而适和HTML的格式代,如果内容包含标签会被转义,可以指定autoescape来确定是否转义。

    >>>linebreaks_filter("白日依山尽,\n黄河入海流。")
    '<p>白日依山尽,<br>黄河入海流。</p>'
    >>>linebreaks_filter("<p>白日依山尽,\n黄河入海流。</p>")
    '<p>&lt;p&gt;白日依山尽,<br>黄河入海流。&lt;/p&gt;</p>'
    
  • linebreaksbr(value, autoescape=True)
    value中的"\n"将被<br/>替代,如果内容包含标签会被转义,可以指定autoescape来确定是否转义。

    >>>linebreaksbr("白日依山尽,\n黄河入海流。")
    '白日依山尽,<br>黄河入海流。'
    
  • safe(value)
    返回没有经过escape转换的value

    >>>safe("<script>console.log(1212);</script>")
    '<script>console.log(1212);</script>'
    
  • safeseq(value)
    与上述safe基本相同,但有一点不同的就是:safe是针对字符串,而safeseq是针对多个字符串组成的sequence。

    >>>safeseq("<script>console.log(1212);</script>")
    ['<', '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("<p>addd<span>bbbbb</span></p>")
    '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']])
    <li>States
    	<ul>
    	    <li>Kansas
    		    <ul>
    	            <li>Lawrence</li>
    	            <li>Topeka</li>
    		    </ul>
    	    </li>
    		<li>Illinois</li>
    	</ul>
    </li>
    
  • 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 H:m:s')
    '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("白日依山<a src='https://www.baidu.com'></a>",5)
    "白日依山<a src='https://www.baidu.com'></a>"
    >>>truncatechars_html("白日依山<a src='https://www.baidu.com'>",5)
    "白日依山<a src='https://www.baidu.com'>"
    
  • 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;类型为:<class 'int'>
    >>>print("1会变成:"+str(apnumber(1))+";类型为:"+str(type(apnumber(1))))
    1会变成:one;类型为:<class 'str'>
    >>>print("9会变成:"+str(apnumber('9'))+";类型为:"+str(type(apnumber('9'))))
    9会变成:九;类型为:<class 'str'>
    >>>print("10会变成:"+str(apnumber(10))+";类型为:"+str(type(apnumber(10))))
    10会变成:10;类型为:<class 'int'>
    
  • 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'
    

版权声明:本文为weixin_39800080原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。