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/