一、为什么要自定义Django中的自定义过滤器:
Django中提供了很多内置的过滤器和标签,详见链接django官网,主要有以下几个:
- autoescape(自动转义)
- block(模板继承)
- csrf_token(跨站伪造请求)
- extends(模板继承)
- filter(过滤器)
- for(循环)
- if(判断)
- include(加载模板)
等等,还有很多详见官网上的内容。
但是虽然Django内置了很多的标签和过滤器但是很多时候我们还需要自定义的过滤器来达到我们网页的效果,这个时候就要考虑我们自己定义一个过滤器和标签了,下面我以一个简单的过滤器作为示例介绍下django的自定义过滤器的写法和规则。
二、下面开始我们自己定义模板和过滤器,我这里以过滤器作为例子说明:
- 代码层
一般的自己定义的过滤器和标签都是和我们django中的app(小应用)绑定在一起的。定义之后,你就可以在模板中使用{% load %}标签加载你自己定义的标签和过滤器了。
在此之前,你要确保你的小应用在INSTALLED_APPS中进行了注册,然后所有你在模板中加载你自定义的小应用的时候django会在小应用内部进行查找,如果你的小应用没有注册,那么django就会找不到。
特别注意:你在添加完你自定义的templatetags模块后,在你使用你自定义的过滤器和标签之前,你需要手动重启django的服务器。(django不会自动重启)
假如我们有一个小应用叫做polls,首先你在你的小应用内新建一个templatetags文件夹,确保文件夹下有init.py文件(python2会自带,python3可能没有,如果没有的话,那就手动创建)。然后在这个文件夹内新建一个你将来想在html模板中使用的自定义标签和过滤器的名字,在这里我们给它命名为poll_extras.py(切记不要和别的小应用内的名字重复)。
所以现在看起来你的代码的文件目录看起来是下面的这个样子:
polls/
__init__.py
models.py
templatetags/
__init__.py
poll_extras.py
views.py
你将来就像{% load poll_extras %}来在html模板中加载你自定义的模板和过滤器。
你在templatetags这个python包中定义多少个标签和过滤器并没有限制,但是特别要注意的是你将来在html的模板中使用的是你定义的这些py文件的名字比如上面的就是poll_extras,而不是django中你注册的小应用的名字。
为了让我们自定义的模板和过滤器可用,那么django要求我们自定义的标签和过滤器必须在django中进行注册,那么我们就需要在我们的poll_extras.py的文件最上面几行添加以下几行代码:
from django import template
register = template.Library()
另外的,模板标签模块也可以通过’libraries’ 参数被注册到DjangoTemplates中。如果要在加载模板标记时使用模板标记模块名称中的不同标签,那么这将非常有用。它还使您能够注册标签,而无需安装应用程序。
在屏幕之后:
对于大量的示例,请阅读Django的默认过滤器和标记的源代码。它们分别在django / template / defaultfilters.py和django / template / defaulttags.py中。
更多关于加载标签的信息,请查看它的文档
2、写我们自定义的模板过滤器
自定义过滤器只是一个接受一个或两个参数的python函数:
变量的值(输入)并不必要是一个字符串。参数的值,这个可以有一个默认的值或者完全留空。
举个例子,在过滤器 {
{ var|foo:"bar" }}
中,过滤器foo将传递变量var和参数“bar”。
因为模板语言不提供异常处理,任何模板过滤器抛出的异常都会被暴露为服务器错误。因此,如果有合理的回退值要返回,过滤器函数应避免抛出异常。如果展示模板的输入中有一个明确错误,提出异常可能仍然比隐藏错误的故障更好