django自定义过滤器

本文介绍了在Django中如何自定义过滤器以满足特定需求,如将日期中的月份转为大写。通过创建templatetags目录,编写myfilter.py文件并注册过滤器,然后在模板中使用该过滤器,实现自定义功能。文章提供了过滤器的两种注册方式,并附带了部分源码解析。

1 django 内置了许多过滤器, 例如date等,但是有些时候这些内置的过滤器无法满足我们的需求,就需要自定义一个过滤器
2 那我们如何自定义一个过滤器呢??
3 把日期中的月份变成大写

3.1 在app目录下建立templatetags/在此目录下建立空文件_init_.py和myfilter.py
这里写图片描述

3.2 .在myfilter.py编辑

from django import template
register = template.Library()
# 定义一个将日期中的月份转换为大写的过滤器,如8转换为八
@register.filter
def month_to_upper(key):
    return ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十', '十一', '十二'][key.month - 1]

3.3这里额外说明一下,就是注册过滤器的时候,有两种方式
第一种就是上面代码中所写的,加一个过滤器@register.filter
第二种写法就就是

register.filter('month_to_upper', month_to_upper)
# 第一个month_to_upper 就是一个别称,第二个month_to_upper就是函数

顺便粘贴一下filter的源码,就能很好的理解了

    def filter(self, name=None, filter_func=None, **flags):
        """
        Register a callable as a template filter. Example:

        @register.filter
        def lower(value):
            return value.lower()
        """
        if name is None and filter_func is None:
            # @register.filter()
            def dec(func):
                return self.filter_function(func, **flags)
            return dec
        elif name is not None and filter_func is None:
            if callable(name):
                # @register.filter
                return self.filter_function(name, **flags)
            else:
                # @register.filter('somename') or @register.filter(name='somename')
                def dec(func):
                    return self.filter(name, func, **flags)
                return dec
        elif name is not None and filter_func is not None:
            # register.filter('somename', somefunc)
            self.filters[name] = filter_func
            for attr in ('expects_localtime', 'is_safe', 'needs_autoescape'):
                if attr in flags:
                    value = flags[attr]
                    # set the flag on the filter for FilterExpression.resolve
                    setattr(filter_func, attr, value)
                    # set the flag on the innermost decorated function
                    # for decorators that need it, e.g. stringfilter
                    if hasattr(filter_func, "_decorated_function"):
                        setattr(filter_func._decorated_function, attr, value)
            filter_func._filter_name = name
            return filter_func
        else:
            raise ValueError(
                "Unsupported arguments to Library.filter: (%r, %r)" %
                (name, filter_func),
            )

3.4在模板中使用

{% load myfilter %}
{{ article.date_publish | month_to_upper }}

这段代码的意思就是加载这个myfilyer文件,然后在需要的地方引入自定义的过滤器,上面的第二行代码,article.date_publish其实就是month_to_upper的实参而已

自定义过滤器的步骤就是这些,不足之处欢迎批评指正,thanks!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值