我正在尝试覆盖Django UserAdmin模型的某些行为。特别是,我想对非超级用户隐藏“超级用户”字段。

所以,我的方法是这样的:

class ModelAdmin(BaseModelAdmin):
    "Encapsulates all admin options and functionality for a given model."

    # ...

    def has_change_permission(self, request, obj=None):
        """
        Returns True if the given request has permission to change the given
        Django model instance.

        If `obj` is None, this should return True if the given request has
        permission to change *any* object of the given type.
        """
        opts = self.opts
        return request.user.has_perm(opts.app_label + '.' + opts.get_change_permission())

    #...


根据我在ModelAdmin中找到的内容

class UserAdmin(UserAdmin):
    """
    ... my customised UserAdmin
    """

    # adding a new method
    def is_superuser(self, request):
        "Returns True if the given user is a superuser."
        return request.user.is_superuser

    # then elsewhere 'hopefully' show a slightly different fieldset
    # the following, of course, doesn't work.

    fieldsets = (
        (None, {
            'fields': (
                ("first_name", "last_name"),
                ("email", "password"),
                "is_staff",
                "is_active",
                "is_superuser" if self.is_superuser() else None

            )
        }),
        ('Groups', {
            'fields': (
                'groups',
            )
        }),
        ('Meta', {
            'classes': ('collapse',),
            'fields': (
                'username',
                "last_login",
                "date_joined"
            )
        })
    )


因此,我的问题是:


如何在新的自定义UserAdmin类中创建一个def,例如上面的类,以及如何调用它? (我怎么知道我何时处于正确的环境中)
第2部分(奖金):如上面的伪代码所建议的,我如何简洁地在表单中包含/排除“ is_superuser”字段?


谢谢大家!

〜达里尔

谢谢

最佳答案

如果只想禁止用户将自己提升为超级用户,请覆盖YourUserAdmin.get_readonly_fields():

class YourUserAdmin(admin.ModelAdmin):
    ...
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return None
        try:
            return self.readonly_fields + ('is_superuser',)
        except:
            return ('is_superuser',)


您必须注销默认的User / UserAdmin,然后再注册自己的。

admin.site.unregister(User)
admin.site.register(User, YourUserAdmin)


但是,管理员的Z​​EN表示:


  Django管理员的核心是针对单个活动而设计的:受信任的用户编辑结构化内容。


如果用户不受信任,则不要授予他编辑权限来编辑用户帐户(期限)。即使您隐藏了超级管理员选项和“按超级管理员状态过滤”过滤器,他也可以更改您的密码并以您的身份登录。因此,如果您需要一些不受信任的用户来编辑用户帐户,请忘记管理员并编写您自己的哑接口。

10-06 04:44