Python 如何在Django中修饰管理操作,操作。名称用作dict键?
为了避免重复,我决定修饰我在Django管理中使用的一些操作。decorator非常简单-包装函数,对其求值,如果出现Python 如何在Django中修饰管理操作,操作。名称用作dict键?,python,django,python-decorators,Python,Django,Python Decorators,为了避免重复,我决定修饰我在Django管理中使用的一些操作。decorator非常简单-包装函数,对其求值,如果出现TransitionError错误,则向用户显示相应的错误消息。它还获取简短描述,并应用它 def transition_action(short_description): def decorator(fn): def wrapped(modeladmin, request, queryset): try:
TransitionError
错误,则向用户显示相应的错误消息。它还获取简短描述
,并应用它
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
但是,如果应用了该装饰器,则只有最后一个操作可见(从应用装饰器的所有位置)。原因是已包装。名称将用作操作字典()的键
显然,解决此行为的一种方法是设置自定义\uuuuu name\uuuuu
,如:包装。\uuuuu name\uuuuuuu=short\u description
。不过,我不喜欢这种方法,因为它似乎有点老土
你有没有更好的方法来对动作进行修饰?我就是这么做的:
def add_short_description(short_description: str):
def decorator(admin_action):
def wrapper(*args, **kwargs):
return admin_action(*args, **kwargs)
wrapper.short_description = short_description
return wrapper
return decorator
然后在admin.py
中:
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
...
actions = [ ..., 'my_action', ...]
@add_short_description('Some description')
def my_action(self, request, queryset):
...
您需要使用@wraps装饰器