【发布时间】:2010-12-23 09:12:27
【问题描述】:
我有一个模板过滤器,它执行一个非常简单的任务并且效果很好,但我想在它上面使用一个装饰器。不幸的是,装饰器导致了一个讨厌的 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()
这是错误:
TemplateSyntaxError at /
渲染时遇到异常: 从空列表中弹出
我已经尝试在装饰器中设置断点,并且我有理由相信它甚至没有被调用...
但以防万一这里是装饰者(我知道有人会要求它)
我(暂时)用一个什么都不做的模拟装饰器替换了装饰器,但我仍然得到同样的错误
def cache_function(cache_timeout):
def wrapper(fn):
def decorator(*args, **kwargs):
return fn(*args, **kwargs)
return decorator
return wrapper
edit CONFIRMED:是因为装饰器占用了*args和**kwargs造成的?我假设正在调用 pop() 以确保所有过滤器都至少采用一个 arg?
将装饰器更改为此可以解决问题:
def cache_function(cache_timeout):
def wrapper(fn):
def decorator(arg1, arg2):
return fn(arg1, arg2)
return decorator
return wrapper
不幸的是,这破坏了装饰器的通用性:/现在该怎么办?
【问题讨论】:
标签: python django django-templates filter templatetags