Python 如何在Django中修饰管理操作,操作。名称用作dict键?

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:

为了避免重复,我决定修饰我在Django管理中使用的一些操作。decorator非常简单-包装函数,对其求值,如果出现
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装饰器