在《Django2:Web项目开发入门笔记(6)》中,我们接触到了Django模板中过滤器的使用。
官方给我们提供了很多写好的过滤器,适用于各种需求。
不过,有的时候还不能满足我们的一些特别需求。
例如,我在最近开发的一个项目的后台中,订单页面的筛选功能有如下需求:
因为没有使用Ajax,页面刷新后列表会重置,所以在模板中写了如下代码:
{% for author in authors %} <option value="{{ author.id }}" <strong>{% if request.GET.order_author == author.id %}</strong> <strong>selected</strong> {% endif %} >{{ author.name }} </option> {% endfor %}
代码中强调的部分,就是通过判断请求中的作者id的参数是否和列表项中的作者id相同,以便选中相应列表项。
但是,这么写完之后,发现页面刷新后列表项还会重置。
明明参数是1,作者id也是1,为什么不会选中呢?
实际上,参数是’1’,作者id是1。
也就是说URL中的参数是字符串,而代码中的order.id是数字。
类型不同,判断失败。
为了解决这个问题,需要参数中的id或者order.id转换一下类型。
但是,我查了很多资料,包括官方文档,都没有这样的过滤器。
那只好自己动手写一个过滤器了。
创建过滤器和使用过滤器的过程如下。
1、添加自定义过滤器和标签的文件夹“templatetags”。
注意:必须使用“templatetags”这个名称,否则无效。
这个文件夹要添加在app的目录下,并且需要包含“__init__.py”文件。
“__init__.py”就是一个空文件,可以自己创建,只要名称正确就可以。
也就是说,这个文件夹是个Python Package,而不是普通的文件夹。
2、在项目设置文件“settings.py”中进行app注册。
INSTALLED_APPS = [ ...省略其他项... 'app名称.templatetags', ]
3、添加编写过滤器的py文件。
在“templatetags”文件夹中新建一个py文件,名称可以自定义,例如:filter.py。
4、在过滤器文件中编写自定义过滤器。
以我的项目需求为例,代码如下:
from django import template # 导入模板模块 register = template.Library() # 获取模板库对象 @register.filter(name='tostr') # 通过模板库对象中的装饰器装饰自定义过滤器,参数name是过滤器的名称。 # @register.filter # 另一种写法,也可以不指定名称,会自动使用被装饰的过滤器函数名称。 def to_str(value): # 定义过滤器函数,参数就是被转换的值。 return str(value) # 返回字符串
到这里,我们就定义好了一个名称为tostr的过滤器,能够将数字转换为字符串。
5、在模板中使用自定义过滤器。
在模板代码中,使用自定义过滤器之前,需要先通过“load”标签加载过滤器的py文件,例如上面的filter.py。
然后,就可以在代码中使用自定义过滤器了。
示例代码:
{% for author in authors %} <strong>{% load filter %}</strong> <option value="{{ author.id }}" {% if request.GET.order_author == author.id|<strong>tostr</strong> %} selected {% endif %} >{{ author.name }} </option> {% endfor %}
本文链接:http://so.lmcjl.com/news/2152/