了解Python类或自定义Django UserAdmin模型

了解Python类或自定义Django UserAdmin模型,python,django-models,django-admin,Python,Django Models,Django Admin,我试图覆盖Django UserAdmin模型的一些行为。特别是,我想对非超级用户隐藏“超级用户”字段 因此,我的方法是: class ModelAdmin(BaseModelAdmin): "Encapsulates all admin options and functionality for a given model." # ... def has_change_permission(self, request, obj=None): """

我试图覆盖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部分(奖励):我如何像上面的psuedo代码所建议的那样,在表单中简洁地包含/排除'is_superuser'字段
谢谢大家

~z~达里尔


谢谢你

没有Django的经验,但认为关闭可能会在这种情况下帮助你:

class UserAdmin(UserAdmin):

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

    def gen_fieldset(self, request):
        '''
        If request.user.is_supeuser == true then return fieldset generator for superuser.
         Else return fieldset generator for normal user.
         ''' 
        su = is_superuser(request)
        def get_fieldset():
            if su:
                return super_user_fieldset
            else:
                return normal_user_fieldset
        return get_fieldset
用法如下所示:

obj = UserAdmin()
request = ... #Generate a normal or super-user request.
fieldset = obj.gen_fieldset(request)
# Sometime later when you want to use the fieldset...
fields = fieldset() # Function will decide which fieldset to give based on gen_fieldset() call earlier.
因此,基本思想是,您可以提前配置get_fieldset()(通过调用gen_fieldset()(在使用闭包的地方),以返回用户级别的适当字段集。为用户提供由gen_fieldset()返回的函数对象。它将在稍后用户调用时生成相应的字段集


注意:如果您以前从未使用过闭包,我建议您在谷歌上搜索其他示例和使用场景。可能还有其他更适合您的解决方案(同样,我不熟悉Django),但这是我想到的第一件事。

没有Django的经验,但认为关闭可能会在这种情况下帮助您:

class UserAdmin(UserAdmin):

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

    def gen_fieldset(self, request):
        '''
        If request.user.is_supeuser == true then return fieldset generator for superuser.
         Else return fieldset generator for normal user.
         ''' 
        su = is_superuser(request)
        def get_fieldset():
            if su:
                return super_user_fieldset
            else:
                return normal_user_fieldset
        return get_fieldset
用法如下所示:

obj = UserAdmin()
request = ... #Generate a normal or super-user request.
fieldset = obj.gen_fieldset(request)
# Sometime later when you want to use the fieldset...
fields = fieldset() # Function will decide which fieldset to give based on gen_fieldset() call earlier.
因此,基本思想是,您可以提前配置get_fieldset()(通过调用gen_fieldset()(在使用闭包的地方),以返回用户级别的适当字段集。为用户提供由gen_fieldset()返回的函数对象。它将在稍后用户调用时生成相应的字段集


注意:如果您以前从未使用过闭包,我建议您在谷歌上搜索其他示例和使用场景。可能还有其他更适合您的解决方案(同样,我不熟悉Django),但这是我想到的第一件事。

如果您只是想禁止用户将自己提升为超级用户,请重写():

您必须取消注册默认用户/UserAdmin,然后注册自己的用户/UserAdmin

admin.site.unregister(User)
admin.site.register(User, YourUserAdmin)
然而,管理的禅宗说:

Django的管理核心是为单一活动设计的:可信用户编辑结构化内容


如果用户不受信任,请不要授予他编辑用户帐户的编辑权限,句号。即使您隐藏superadmin选项和“按superadmin状态筛选”筛选器,他也可以更改您的密码并以您的身份登录。因此,如果您需要一些不受信任的用户来编辑用户帐户,请忘记管理员,编写您自己的简化界面。

如果您只是想禁止用户将自己升级为超级用户,请重写():

您必须取消注册默认用户/UserAdmin,然后注册自己的用户/UserAdmin

admin.site.unregister(User)
admin.site.register(User, YourUserAdmin)
然而,管理的禅宗说:

Django的管理核心是为单一活动设计的:可信用户编辑结构化内容


如果用户不受信任,请不要授予他编辑用户帐户的编辑权限,句号。即使您隐藏superadmin选项和“按superadmin状态筛选”筛选器,他也可以更改您的密码并以您的身份登录。因此,如果您需要一些不受信任的用户来编辑用户帐户,请忘记管理员,编写您自己的简化界面。

Stackers,以前从未听说过这个界面……通常情况下,我认为您需要做的是创建一个自定义表单,并将其分配给管理员的
表单
成员。问题是,这一级别的定制通常是从一个视图而不是一个模型来完成的;我所能想到的一切都不会有
请求
可用。换句话说,你可以为每个人隐藏“是超级用户”,这不是你想要的,对吗?Stackers,以前从未听说过这个…通常,我认为你需要做的是创建一个自定义表单,并将其分配给你的管理员的
表单
成员。问题是,这一级别的定制通常是从一个视图而不是一个模型来完成的;我所能想到的一切都不会有
请求
可用。换句话说,你可以为每个人隐藏“Is Superuser”,这不是你想要的,对吧?不确定这会起作用,因为Django的模型是基于元类的,元类通过类的成员来创建真正的类。因此,它将寻找一个名为
fieldset
的成员来生成表单。不确定这是否可行,因为Django的模型是基于元类的,元类通过类的成员来创建真正的类。因此,它将寻找名为
fieldset
的成员来生成表单;他想让它消失。@Mike DeSimone:这没有意义,因为信息在用户列表中可用(按超级用户状态筛选)。我打赌他会问下一步如何隐藏该信息。@Mike:有些没用,因为即使隐藏超级管理员选项和“按超级管理员状态筛选”筛选器,有人可以更改Daryl的密码并使用他的凭据登录;他想让它消失。@Mike DeSimone:这没有意义,因为信息在用户列表中可用(按超级用户状态筛选)。我打赌他会问下一步如何隐藏该信息。@Mike:有些没用,因为即使隐藏超级管理员选项和“按超级管理员状态筛选”筛选器,有人可以更改Daryl的密码,然后用他的凭据登录。