所以,我有这个代码
class PostAdmin(models.ModelAdmin):
# ...
def display_confirm_button(self, obj):
# some code
# ...
如何在display_confirm_button方法中获取当前用户?
答案 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