为超级用户以外的用户排除Django admin中的字段

Mar*_*alc 14 python django

我有一个简单的MyUserPermissionsMixin.user.is_superuser等于True只能由超级用户.我希望能够在我的网站上做类似的事情admin.py:

    if request.user.is_superuser:
        fieldsets = (
            (None, {'fields': ('email', 'password')}),
            ('Permissions', {'fields': ('is_admin','is_staff')}),
            ('Place', {'fields': ('place',)}),
            ('Important dates', {'fields': ('last_login',)}),
        )
    else:
        fieldsets = (
            (None, {'fields': ('email', 'password')}),
            #('Permissions', {'fields': ('is_admin','is_staff')}),
            ('Place', {'fields': ('place',)}),
            ('Important dates', {'fields': ('last_login',)}),
        )
Run Code Online (Sandbox Code Playgroud)

基本上我希望我的用户能够创建其他用户,但不要给他们管理员或东西权限.只有超级用户才能做到这一点.

yuv*_*uvi 17

如果我理解正确,您要做的是覆盖ModelAdmin的get_form方法.此基础上从Django文档的例子,它会是这个样子:

class MyUserAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        self.exclude = []
        if not request.user.is_superuser:
            self.exclude.append('Permissions') #here!
        return super(MyUserAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

现在你可能需要稍微破解一下,也可以覆盖save方法.我不久前做了类似的事情,它不是那么复杂(而且文档很棒).

可能有一个更简单的解决方案,但你的问题有点笼统,你没有分享你的用户模型,所以我无法告诉你如何解决这个问题.我希望这有帮助!

  • 这不对.如果有人打开没有超级用户权限的管理站点 - 排除附加字段"权限".但是当您以超级用户身份重新登录管理站点时 - 您可以看到带有排除字段的管理站点.为了解决这个问题,我使用"if ...:... else:..."将更改的字段返回到原始状态. (4认同)

Mat*_*att 17

接受的答案很接近,但正如其他人指出的那样,get_form在Admin模型的同一个实例上被多次调用,并且实例被重用,因此您可以最终重复使用字段或其他用户在self.fields被修改后看到字段.在Django <= 1.6中试试这个:

class MyAdmin(admin.ModelAdmin):

    normaluser_fields = ['field1','field2']
    superuser_fields = ['special_field1','special_field2']

    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            self.fields = self.normaluser_fields + self.superuser_fields
        else:
            self.fields = self.normaluser_fields

        return super(MyAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)

看起来,Django 1.7引入了一个get_fields()方法,你可以覆盖这是一个更好的方法:

https://github.com/django/django/blob/d450af8a2687ca2e90a8790eb567f9a25ebce8​​5b/django/contrib/admin/options.py#L276


And*_*rie 5

Django 现在get_exclude在 ModelAdmin 上有一个方法来以编程方式排除字段。

它将当前请求和对象(如果有)作为参数。您可以在 request 参数上进行检查以查看他们是否是超级用户并检查

class MyModelAdmin(admin.ModelAdmin):
    def get_exclude(self, request, obj=None):
        excluded = super().get_exclude(request, obj) or [] # get overall excluded fields

        if not request.user.is_superuser: # if user is not a superuser
            return excluded + ['extra_field_to_exclude']

        return excluded # otherwise return the default excluded fields if any
Run Code Online (Sandbox Code Playgroud)