python - 我的代码中的@register.filter

标签 python django

from django import template

register = template.Library()

class_converter = {
    "textinput":"textinput textInput",
    "fileinput":"fileinput fileUpload"
}

@register.filter#<--------
def is_checkbox(field):
    return field.field.widget.__class__.__name__.lower() == "checkboxinput"

@register.filter#<--------
def with_class(field):
    class_name = field.field.widget.__class__.__name__.lower()
    class_name = class_converter.get(class_name, class_name)
    if "class" in field.field.widget.attrs:
        field.field.widget.attrs['class'] += " %s" % class_name
    else:
        field.field.widget.attrs['class'] = class_name
    return unicode(field)

而register.filter函数是:

def filter(self, name=None, filter_func=None):
        if name == None and filter_func == None:
            # @register.filter()
            return self.filter_function
        elif filter_func == None:
            if(callable(name)):
                # @register.filter
                return self.filter_function(name)
            else:
                # @register.filter('somename') or @register.filter(name='somename')
                def dec(func):
                    return self.filter(name, func)
                return dec
        elif name != None and filter_func != None:
            # register.filter('somename', somefunc)
            self.filters[name] = filter_func
            return filter_func
        else:
            raise InvalidTemplateLibrary("Unsupported arguments to Library.filter: (%r, %r)", (name, filter_func))

所以

@register.filter
def a():
    pass

相等

register.filter(name=None,filter_func=a)

是吗?

最佳答案

不完全是。装饰器语法:

@register.filter
def a():
   pass

是语法糖:

def a():
    pass
a = register.filter(a)

因此,在这种情况下,将使用第一个位置参数调用 register.filter ,“name”是您的函数。然而,django register.filter 函数会处理该用法并返回正确的内容,即使过滤器作为第一个参数发送(请参阅 if callable(name) 分支)

更常见的是让可以接受多个参数的装饰器这样做,并将要装饰的函数作为第一个位置参数(或者作为函数工厂/闭包),但我有一种感觉 django 这样做的原因是为了向后兼容。其实我依稀记得以前不是装饰器,后来的django版本才成为装饰器。

关于python - 我的代码中的@register.filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2080296/

相关文章:

python - 使用 PIL 将 JPG 从 Adob​​eRGB 转换为 sRGB?

Python 请求 : Passing multiple client certificates to session. 证书

django - 用于自动设置和部署 Django 项目的好工具

java - Java 中的包?

Python 正则表达式 £ 到 char

python - 从 X、Y、Z 坐标数据创建 3D 表面网格

python - 使用 Pandas 在选项卡中的单个 csv 表中添加多个 csv

python - 使用 python/django 让用户使用他们的谷歌凭据登录我的网站

python - django - 可选 url 参数的正则表达式

python - 我如何为 Django 1.8 编写初始数据