【发布时间】:2017-05-04 20:45:12
【问题描述】:
为了避免重复,我决定装饰一些我在 Django 管理中使用的操作。装饰器非常简单 - 包装函数,评估它,并在 TransitionError 的情况下向用户显示适当的错误消息。它还获取short_description 并应用它。
def transition_action(short_description):
def decorator(fn):
def wrapped(modeladmin, request, queryset):
try:
return fn(modeladmin, request, queryset)
except TransitionNotAllowed:
message = _("Transition not allowed.")
messages.error(request, message)
wrapped.short_description = short_description
return wrapped
return decorator
但是,如果应用了该装饰器,则只有最后一个操作可见(从应用装饰器的所有位置)。原因是 wrapped.__name__ 将用作操作字典 (reference) 的键。
显然,解决此问题的一种方法是设置自定义__name__,如下所示:wrapped.__name__ = short_description。不过我不喜欢这种方法,因为它看起来有点老套。
您有更好的方法来将装饰应用于动作吗?
【问题讨论】:
-
你需要使用@wraps装饰器docs.python.org/2/library/functools.html#functools.wraps
标签: python django python-decorators