我有一个模板过滤器,它执行一个非常简单的任务并且效果很好,但我想在它上面使用一个装饰器。不幸的是,装饰器导致了一个没有任何意义的讨厌的 django 错误......
有效的代码:
@register.filter(name="has_network")
def has_network(profile, network):
hasnetworkfunc = getattr(profile, "has_%s" % network)
return hasnetworkfunc()
使用装饰器(不起作用):
@register.filter(name="has_network")
@cache_function(30)
def has_network(profile, network):
hasnetworkfunc = getattr(profile, "has_%s" % network)
return hasnetworkfunc()
这是错误:
/ 处的模板语法错误
渲染时遇到异常:从空列表中弹出
我已经尝试在装饰器中设置断点,并且我有理由相信它甚至没有被调用......
但以防万一这里是装饰者(我知道有人会要求它)
我用一个什么都不做的模拟装饰器(暂时)替换了装饰器,但我仍然得到同样的错误
def cache_function(cache_timeout):
def wrapper(fn):
def decorator(*args, **kwargs):
return fn(*args, **kwargs)
return decorator
return wrapper
编辑确认:这是因为装饰器需要*args
和**kwargs
?我假设pop()
正在调用以确保过滤器都至少采用一个 arg?
将装饰器更改为此可以解决问题:
def cache_function(cache_timeout):
def wrapper(fn):
def decorator(arg1, arg2):
return fn(arg1, arg2)
return decorator
return wrapper
不幸的是,这破坏了装饰器的通用性:/现在该怎么办?