Django2模板中使用自定义过滤器

2024年04月15日 django Python51

在《Django2:Web项目开发入门笔记(6)》中,我们接触到了Django模板中过滤器的使用。

官方给我们提供了很多写好的过滤器,适用于各种需求。

不过,有的时候还不能满足我们的一些特别需求。

例如,我在最近开发的一个项目的后台中,订单页面的筛选功能有如下需求:

  • 通过商品作者筛选时,以GET方式将商品作者的id传到视图;
  • 视图中通过商品作者的id查询到相应的订单,返回新的订单页面;
  • 在新的订单页面中,筛选列表中的对应商品作者的项要根据URL中的参数选中。

因为没有使用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/

展开阅读全文