如何在Django Admin中获取自定义方法的当前用户?

时间:2016-02-11 10:17:22

标签: python django django-admin

所以,我有这个代码

class PostAdmin(models.ModelAdmin):
    # ...
    def display_confirm_button(self, obj):
        # some code
    # ...

如何在display_confirm_button方法中获取当前用户?

2 个答案:

答案 0 :(得分:6)

class PostAdmin(models.ModelAdmin):
    # ...
    def display_confirm_button(self, obj):
        # some code
    # ...

要访问登录用户,您需要访问请求对象。您无法使用display_confirm_button方法访问请求,因为您只能访问正在编辑的对象obj

解决方案是覆盖get_list_display,它可以访问request对象。然后,您可以在 get_list_display中定义您有权访问请求的display_confirm_button ,并在您返回的列表中包含display_confirm_button callable。

class MyModelAdmin(admin.ModelAdmin):
    def get_list_display(self, request):

        def display_confirm_button(obj):
            out = logic_that_requires_user(request.user)
            return out

        return ['field1', 'field2', display_confirm_button, ...]

答案 1 :(得分:0)

最佳解决方案IMHO将当前用户存储在changelist_view中,以便在您的方法中访问它。

class PostAdmin(models.ModelAdmin):
    def changelist_view(self, request, extra_context=None):
        setattr(self, 'user', request.user)
        return super().changelist_view(request, extra_context)

    def display_confirm_button(self, obj):
        # you can use self.user here

你可以通过创建这样的mixin来保持这个DRY:

class CurrentUserMixin(object):
    def changelist_view(self, request, extra_context=None):
        setattr(self, 'user', request.user)
        return super().changelist_view(request, extra_context)


class PostAdmin(CurrentUserMixin, models.ModelAdmin):
    def display_confirm_button(self, obj):
        # you have self.user here