Skip to content

二、过滤器和测试器

在模板中,过滤器实现对某个变量进行处理,通过管道符号(|)调用

例如:

js
{{name|length}}   //返回name的长度

一、自定义过滤器

过滤器本质是python的函数,它会把被过滤的值当作第一个参数传给这个函数,经过一些逻辑处理后,在返回新的值。

过滤器函数写好后可以通过@app.template_filter装饰器或者app.add_template_filter函数把函数注册为JinJa2能用的过滤器

1、使用app.add_template_filter注册过滤器

app.add_template_filter(被注册的函数,"注册的过滤器名字")

python
def datetime_format(value,format="%Y-%d-%m %H:%M"):
	return value.strftime(format)

app.add_template_filter(datetime_format,"dformat")
python
{{article.date | dformat}}
{{article.date | dformat(%B %Y)}}

2、使用@app.template_filter注册过滤器

@app.template_filter("过滤器名字")

python
@app.template_filter("dformat")
def datetime_format(value,format="%Y-%d-%m %H:%M"):
	return value.strftime(format)

二、Jinja2内置过滤器

  1. abs(value):获取 value 的绝对值。

  2. default(value,default_1value,boolean=False):如果 value 没有定义,则返回第2个参数 default_value

    1. boolean 参数为False时,如果 value 被判断为False ,则返回default_value
    2. boolean 参数为 True 时,无论 value 是什么,都会返回 default value
  3. escape(value):将一些特殊字符,如&、<、>、“、‘进行转义。因为 Jimja2 默认开启了全局转义,所以在大部分情况下无须手动使用这个过滤器去转义,只有在关闭了转义的情况下,会需要使用到它

  4. filesizeformat(value,binary=False): 过滤器将字节大小转换为易读的格式

    1. binary=False:以 1000 为基础进行计算,1 KB = 1000 bytes,1 MB = 1000 KB,1 GB = 1000 MB
    2. binary=True:以 1024 为基础进行计算,1 KiB = 1024 bytes,1 MiB = 1024 KiB,1 GiB = 1024 MiB
  5. frist(value):返回 value 序列的第1个元素

  6. float(value,default=0.0):将value 转换为浮点类型,如果转换失败会返回0.0

  7. format(value,*args,**kwargs):格式化字符串

    python
    <!-- 假设 message 是一个需要格式化的字符串 -->
        {% set message = "Hello, {}!" %}
        
        <!-- 使用 format 过滤器格式化字符串 -->
        <p>{{ message | format("World") }}</p>
  8. groupby(value,attribute,default-None):value 是一个序列,可以使用参数 attribute进行分组

    例如,有一个uses 列表,里面的user 都有一个 city 属性,如果要按照 city进行分组

    python
    <u1>
    {% for group in users|groupby("city") %}
    	<li>{{ group.grouper }}:{{ group.list|join(", ")}}</li>
    {% endfor %}
    </ul>
    1. group.grouper:在每个分组中,grouper 属性表示当前分组的标签,即按照哪个属性进行了分组。在这里,它代表了城市的名称
    2. group.list:这是当前分组中所有元素的列表
  9. int(value,default-0,base=10):转换为整型,如果转换失败会返回0,并且默认按照十进制转换

  10. join(value,attribute):使用 attribute 指定的元素,将一个序列拼接成一个字符串

  11. last(value):返回 value 序列的最后一个元素

  12. length(value):返回 value 序列的长度

  13. list(value):换 value 为一个列表

  14. 1ower(value):将value 全部转换为小写

    1. 如要将 titles 序列中每个元素的值都变成小写形式,那么可以使用以下代码实现

      python
      {{ titles|map("lower")}}
  15. map(value,*args,**kwargs):将 value 这个序列都执行某个操作

    1. 如获取 users这个序列中每个user 的 username 字段

      python
      {{ users|map(attribute='username')}}
  16. max(value):求序列中的最大值

  17. min(value):求序列中的最小值

  18. random(value):返回 value 这个序列中的一个随机值

  19. reject(value,*args,**kwargs):过滤 value 这个序列中的一些元素,过滤的条件通过后面的参数给定。如要过滤列表中所有的奇数,可以把Jinja2中内置的 odd 过滤器传给reject 过滤器来实现,

    python
    {{ numbers|reject('odd')}}
  20. rejectattr(value,*args,**kwargs):根据 value 序列中元素的某个属性进行过滤,只要这个属性满足条件,那么就会被过滤掉

    python
    {{users|rejectattr("is_active")}}
    {{users|rejectattr("email","none")}}

    第1行代码是过滤users 中is_active为True 的对象,第2行代码是过滤 users 中email为none 的对象

  21. replace(value,old,new,count):将字符串value 中的old 替换为new,并且可以通过 count 来确定替换多少个

  22. reverse(value):将value 这个列逆序

  23. safe(value):在渲染 value 时,关闭自动转义

  24. select(value,*args,**kwargs):选择 value 序列中满足条件的元素,与reject 正好相反

  25. selectattr(value,*args,**kwargs):根据 value 列中元素的某个属性进行过滤,留下满足条件的,过滤掉不满足条件的,与``rejectattr` 正好相反

  26. sort(value,reverse=False,case_sensitive=False,attribute=None):将value 这个序列进行排序

    1. reverse 代表是否逆向排序
    2. case_sensitive代表是否忽略大小写
    3. attribute 代表根据value 列中元素的某个属性排序
  27. string(value):将value 转换为字符串类型

  28. striptags(value):将字符串 value 中的 HTMI, 标签去除,留下文本内容

  29. tojson(value):将value 转换为JSON 格式的字符串

  30. trim(value):删除value 前面和后面的空白字符(空格)

  31. truncate(value,length=255,killwords=False,end="..")

    1. value:要截取的字符串

    2. length:要保留的字符长度,默认为255

    3. killwords:布尔值,表示在截取字符串时是否要裁剪单词,默认为False。如果设置为True,则截取的字符串可能会在单词中断,而不是在单词之间断开

    4. end:末尾的结束字符,默认为"..”

      如果killwords参数为false,并且在截取到指定长度时单词尚未截完,则截取器将继续向后截取,直到当前单词结束。因此,即使在长度为200时截取到单词尚未结束,截取器也会继续截取该单词,直到完整的单词结束或达到字符串的末尾

  32. unique(value,case sensitive=False,attribute=None):将value 序列中的重复元素删除

    1. case_sensitive代表是否忽略大小写
    2. attribute代表使用 value 序列中元素的某个属性
  33. upper(value):将value 所有字符全部转换为大写

  34. urlencode(value):如果 value 是字符串,那么底层会调用 Python 的 urllib.parse.quote;如果 value 是字典,那么底层会调用Python的urlen.parse.urlencode

  35. urlize(value,trim_url_limit=None,nofollow=False,target=None,rel=None,extra_schemes=None):将 value 变成可以单击的链接,如URL 和邮箱。注意:value 必须是以http://https://www.mailto 开头的字符串

  36. wordcount(value):统计value 中共有多少个单词

  37. xmlattr(value,autospace=True):value 为一个字典,根据这个字典创建一个 xml格式的属性

    python
    <ul 
    	{{
    		{'class':'my list',
    		 'missing': none,
    		 'id':'list-&d'|format(variable)
    		 } | xmlattr 
        }}
       >
    </ul>

三、测试器

测试器描述
boolean是否为布尔类型
callable是否能被调用
defined是否定义
divisibleby是否能被某个数整除
eq是否和另外一个值相等
еscaped是否已经被转义
even是否为偶数
false是否为False
filter是否为过滤器
float是否为浮点类型
ge是否大于或等于某个数
gt是否大于某个数
in是否在某个序列中,与 Python 中的in语法类似
integer是否为整型
iterable是否为可迭代类型
le是否小于或等于某个数
lower是否全部为小写
lt是否小于某个数
mapping是否为一个 mapping 对象(如字典)
ne是否不等于某个数
none是否为 None
number是否为数值类型
odd是否为奇数
sameas是否在内存中和另外一个对象是一样的
sequence是否为序列(如列表、元组)
string是否为字符串
test是否为一个测试器
true是否为 True
undefined是否没有定义
upper是否全部为大写