У меня есть шаблонный фильтр, который выполняет очень простую задачу и работает хорошо, но я бы хотел использовать для этого декоратор. К сожалению, декоратор вызывает неприятную ошибку 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 ПОДТВЕРЖДЕНО : Это вызвано тем, что декоратор принимает *args
и **kwargs
? Я предполагаю, что pop()
вызывается, чтобы гарантировать, что все фильтры принимают хотя бы один аргумент?
Смена декоратора для решения этой проблемы:
def cache_function(cache_timeout):
def wrapper(fn):
def decorator(arg1, arg2):
return fn(arg1, arg2)
return decorator
return wrapper
К сожалению, это разрушает общий характер декоратора: / что теперь делать?