自定义过滤器

过滤器主要是对上下文的内容进行操作处理,如替换、反序和转义等。通过过滤器处理上下文可以将其数据格式或内容转化为我们想要的显示效果,而且相应减少视图的代码量。过滤器的使用方法如下:

 

若上下文设有过滤器,则模板引擎在解析上下文时,首先由过滤器filter处理上下文variable,然后将处理后的结果进行解析并显示在网页上。variable代表模板上下文,管道符号“|”代表当前上下文使用过滤器,filter代表某个过滤器。单个上下文可以支持多个过滤器同时使用,例如:

 

在使用的过程中,有些过滤器还可以传入参数,但仅支持传入一个参数。带参数的过滤器与参数之间使用冒号隔开,并且两者之间不能留有空格,例如:

 

django.template.Library.filter()

每当你写好你的过滤器定义的时候,你需要用你的 Library 实例去注册它,从而让它对于 Django 模板语言而言是可用的

Library.filter() 方法有两个参数:

  1. 过滤器的名称——字符串。
  2. 编辑函数——一个 Python 函数(不是函数名的字符串)。

你也能以装饰器的模式使用 register.filter():

若你不填 name 参数, Django 会将函数名当做过滤器名。

最后, register.filter() 也接受 3 个关键字参数, is_sage, needs_autoescape,和 expects_localtime。

模板过滤器期望字符串

django.template.defaultfilters.stringfilter()

如果编写只接收一个字符串作为第一个参数的模板过滤器,你需要使用 stringfilter 的装饰器。它会将参数前转为字符串后传递给函数

过滤器和自动转义

编写自定义过滤器时,考虑一下过滤器将如何与 Django 的自动转义行为交互。

  • 原始字符串 指原生 Python 字符串。在输出时,如果自动转义生效,则对它们进行转义,否则将保持不变。
  • 安全字符串 是在输出时被标记为安全的字符串,不会进一步转义。必要的转义已在之前完成。它们通常用于原样输出 HTML,HTML 会在客户端被解释。

模板过滤器代码有两种情况:

  1. 你的过滤器不会将任何 HTML 不安全的字符(<, >, ', " or &)引入尚未出现的结果中。这种情况下,可以让 Django 自动为您处理所有的转义操作。你只需在注册自己的过滤器函数时,将 is_safe 标志置为 True,

模板过滤器代码有两种情况:

  1. 你的过滤器不会将任何 HTML 不安全的字符(<, >, ', " or &)引入尚未出现的结果中。这种情况下,可以让 Django 自动为您处理所有的转义操作。你只需在注册自己的过滤器函数时,将 is_safe 标志置为 True,
  2. 或者,你的过滤器代码要手动关注必须的转义操作。这在输出新 HTML 标记时是必须的。想要避免你的 HTML 标记不被后续操作转义,你要将输出标记为安全的,且需要自己处理输入。

2,要将输出标记为安全字符串,使用 django.utils.safestring.mark_safe()

Django的内置过滤器可以在源码(\django\template\defaultfilters.py)里找到具体的定义过程

 

 

 

 

使用过滤器的过程中,上下文、管道符号“|”和过滤器之间没有规定使用空格隔开,但为了符合编码的规范性,建议使用空格隔开。倘若过滤器需要设置参数,过滤器、冒号和参数之间不能有空格,否则会提示异常信息

在实际开发中,如果内置过滤器的功能不太适合开发需求,我们可以自定义过滤器来解决问题

 

 

 

过滤器与标签的自定义过程有相似之处,但过滤器的定义过程比标签更简单,只需定义相关函数即可。上述定义的过滤器是实现模板上下文的字符替换,定义过程说明如下:

●函数do_replace由装饰器register.filter(name='replace')处理,对函数执行过滤器注册操作。

●装饰器参数name用于为过滤器命名,如果没有设置参数name,就以函数名作为过滤器名。函数名没有具体要求,一般以“do_过滤器名称”或“过滤器名称”作为命名规范。

●参数value代表使用当前过滤器的模板上下文,参数agrs代表过滤器的参数。函数将参数agrs以冒号进行分割,用于参数value(模板上下文)进行字符串替换操作,函数必须将处理结果返回,否则在使用过程中会出现异常信息。

模板文件index.html使用自定义过滤器时,需要使用{% load myfilter %}导入过滤器文件,这样模板引擎才能找到自定义过滤器,否则会提示TemplateSyntaxError异常。过滤器replace将模板上下文value进行字符串替换,将value里面的Python替换成Django

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值