21

我有一个简单的MyUser课程PermissionsMixinuser.is_superuserTrue适用于超级用户。我希望能够在我的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',)}),
        )

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

4

6 回答 6

19

接受的答案很接近,但正如其他人指出的那样,在 Admin 模型的同一个实例上多次调用 get_form 并且该实例被重用,因此您最终可能会重复字段或其他用户在 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)

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

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

于 2014-07-30T00:01:17.170 回答
18

如果我理解正确,您想要做的是覆盖 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)

现在您可能需要稍微修改一下,并且可能还需要覆盖 save 方法。不久前我做了类似的事情,它并不复杂(而且文档很棒)。

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

于 2013-10-06T08:27:01.763 回答
7

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
于 2019-01-13T22:16:09.480 回答
0

根据Django Docs,正确的方法是为超级用户创建一个 ModelForm ,为普通用户创建另一个。然后在 ModelAdmin 的 get_form 方法中指定每个表单:

class MyModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            kwargs['form'] = MySuperuserForm
        else:
            kwargs['form'] = MyNormalForm
        return super(MyModelAdmin, self).get_form(request, obj, **kwargs)
于 2015-01-21T21:19:39.773 回答
0

我受先前答案的启发以这种方式解决了它。在我的示例中,只有超级用户可以创建超级用户。如果它不是超级用户,则缺少表单中的复选框。它对我有用,我希望它是正确的:

    def get_form(self, form_class=form_class):

        if self.request.user.is_superuser is False:
            self.form_class.base_fields.pop('is_superuser')
        return super(AccountCreateView, self).get_form()
于 2019-11-04T13:14:48.130 回答
0

从 Django 1.7 开始,您可以将模型管理员的基类替换为:

class SuperuserAwareModelAdmin(admin.ModelAdmin):
    superuser_fields = None
    superuser_fieldsets = None

    def get_fieldsets(self, request, obj = None):
        if request.user.is_superuser and self.superuser_fieldsets:
            return (self.fieldsets or tuple()) + self.superuser_fieldsets
        return super(SuperuserAwareModelAdmin, self).get_fieldsets(request, obj)

    def get_fields(self, request, obj = None):
        if request.user.is_superuser and self.superuser_fields:
            return (self.fields or tuple()) + self.superuser_fields
        return super(SuperuserAwareModelAdmin, self).get_fields(request, obj)

例子:

class MyModelAdmin(SuperuserAwareModelAdmin):
    superuser_fieldsets = (
        (_('Permissions'), {'fields': ('is_staff', )}),
    )

SuperuserAwareModelAdmin类也可以创建为 mixin。

于 2016-09-12T11:17:14.623 回答