盘点django的过滤器,盘它!

2020年07月30日 未雨晴空 0评论 560阅读 0喜欢

前言

不得不说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
  • 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'
    

其他过滤器如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'
    

发表评论 取消回复

电子邮件地址不会被公开。

请输入以http或https开头的URL,格式如:https://oneisall.top