django:如何根据用户自定义ModelAdmin表单的显示?

时间:2010-09-05 16:40:11

标签: django

我有一个由Django Admin管理的模型。如何根据当前登录的用户自定义其编辑表单的显示?例如,如果超级用户以外的其他人正在修改模型,我想隐藏某些字段。

如果我可以根据fields

设置request.user,那就太棒了

3 个答案:

答案 0 :(得分:2)

执行此操作的一种hackish方法是在调用changelist视图时覆盖list_display变量:

class MyModelAdmin(admin.ModelAdmin)
    def changelist_view(self, request, extra_context=None):
        user = request.user
        if user.is_superuser:
            self.list_display = ['field1', 'field2']
        else:
            self.list_display = ['field1']
        return super(MyModelAdmin, self).changelist_view(request, extra_context=None)

但每次都要将变量设置为所需的值,因为也可能会为其他用户的请求调用相同的管理实例!

答案 1 :(得分:1)

更改编辑表单的一个有趣方法是仅更改只读字段列表。

为此目的,只覆盖函数 get_readonly_fields

class MyModelAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        user = request.user
        if user.is_superuser:
            readonly = []
        else:
            readonly = ['field1']
        return readonly

关于 list_display 现代修改方法是重新定义 get_list_display

原始定义只返回self.list_display

class ModelAdmin:
    def get_list_display(self, request):
        """
        Return a sequence containing the fields to be displayed on the
        changelist.
        """
        return self.list_display

所以你可以提供:

class MyModelAdmin(admin.ModelAdmin):
    def get_list_display(self, request):
        user = request.user
        if user.is_superuser:
            list_display = ['field1', 'field2']
        else:
            list_display = ['field1']
        return list_display

答案 2 :(得分:0)

我认为这个答案中描述了一种不那么强硬的方式:https://stackoverflow.com/a/16115125/710394

def get_list_display(self, request):
    ...whatever logic you need here...