Python 如何限制员工用户在Django管理页面中仅查看其信息?

Python 如何限制员工用户在Django管理页面中仅查看其信息?,python,django,django-admin,Python,Django,Django Admin,我已经创建了一个自定义Django管理页面。我有两种类型的用户可以访问管理页面(职员用户和超级用户)。超级用户可以查看所有用户,并可以更改其设置。他还可以添加或删除用户。员工用户只能查看他们的设置,并且可以更改其中的一些设置。我目前有一个问题,员工用户可以看到web应用程序的所有用户,并可以添加或删除他们。我限制员工用户查看某些设置,但无法更改 我不知道如何限制员工用户只查看他们的设置 这是我的密码: 管理员 Models.py: class UserManager(BaseUserManage

我已经创建了一个自定义Django管理页面。我有两种类型的用户可以访问管理页面(职员用户和超级用户)。超级用户可以查看所有用户,并可以更改其设置。他还可以添加或删除用户。员工用户只能查看他们的设置,并且可以更改其中的一些设置。我目前有一个问题,员工用户可以看到web应用程序的所有用户,并可以添加或删除他们。我限制员工用户查看某些设置,但无法更改

我不知道如何限制员工用户只查看他们的设置

这是我的密码: 管理员

Models.py:

class UserManager(BaseUserManager):
    def create_user(self, username, config_file, password=None, is_active=True, is_staff=False, is_superuser=False):
        if not username:
            raise ValueError("User must have username!")
        if not password:
            raise ValueError("User must have password!")
        if not config_file:
            raise ValueError("Select config file!")
        user_obj = self.model(
            username=username,
        )
        user_obj.config_file = config_file
        user_obj.staff = is_staff
        user_obj.superuser = is_superuser
        user_obj.active = is_active
        user_obj.set_password(password)
        user_obj.save(using=self._db)
        return user_obj

    def create_staffuser(self, username, config_file, password=None):
        user = self.create_user(
            username=username,
            config_file=config_file,
            password=password,
            is_staff=True
        )
        return user

    def create_superuser(self, username, config_file, password=None):
        user = self.create_user(
            username=username,
            config_file=config_file,
            password=password,
            is_staff=True,
            is_superuser=True
        )
        return user


class CustomUser(AbstractBaseUser, PermissionsMixin):
    class Meta:
        verbose_name = "User"
        verbose_name_plural = "Users"

    OPTIONS = (
        ('1', '1'),
        ('2', '2'),
        ('3', '3'),
        ('4', '4'),
    )
    username = models.CharField(unique=True, max_length=255)
    active = models.BooleanField(default=True,
                                 help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.')
    staff = models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.')
    superuser = models.BooleanField(default=False,
                                    help_text='Designates that this user has all permissions without explicitly assigning them.')
    config_file = models.CharField(choices=OPTIONS, max_length=255)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['config_file']

    object = UserManager()

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_lable):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_superuser(self):
        return self.superuser

    @property
    def is_active(self):
        return self.active


def path(user, filename):
    return os.path.join(str(user))
我将非常感谢您对我如何添加此功能的任何帮助或说明。

在您的模板中:

{% if request.user.is_superuser %}
<!-- Only superusers can view things in here -->
{% endif %}
{%if request.user.is_superuser%}
{%endif%}

在您的视图中,您还必须控制哪些内容可以编辑,哪些内容不能编辑。

您可以将超级用户设置为仅在admin类中具有添加/删除权限

class UserAdmin(BaseUserAdmin):
...
def具有添加权限(self、request、obj=None):
return request.user.is_superuser
def具有删除权限(self、request、obj=None):
return request.user.is_superuser
注意:通过在管理界面中不向任何组或用户授予添加或删除权限,也可以实现上述目的

以下内容仅允许用户更改超级用户的所有用户。否则,他们将只能更改自己的用户

def具有更改权限(self、request、obj=None):
return request.user.is_superuser or(obj和obj.id==request.user.id)
如果您希望他们能够看到用户列表页面,并且只有他们的用户可见,您可以修改
get\u queryset

def get_queryset(self,request):
qs=super().get_queryset(请求)
user=request.user
如果user.is\u superuser else qs.filter(id=user.id),则返回qs

首先,使用方法
具有更改权限()
具有查看权限()
等。。。根据登录的用户,完全阻止查看/更改某些用户的访问。然后,如果你想更改哪些字段可以编辑,那么设置
disabled
是正确的,但我不理解你的逻辑,因为你要在集合中添加两次相同的字段。覆盖模板或视图不是管理更改表单的最简单的事情。在这种情况下不推荐使用,因为您必须手动呈现表单字段,这将破坏ModelAdmin的整个表单构建逻辑。在此if语句中,if obj.id==request.user.id:I get
“NoneType”对象没有属性“id”
。我做错了什么?@MihaelWaschl
如果obj和obj.id==request.user.id:
如果您正在添加一个新对象,
obj
将不存在,并且将是
None
。我的错误是,我将更新我的答案。我注意到,如果您重写get\u queryset方法,当用户传递一些搜索参数时,将显示这些受限对象。
{% if request.user.is_superuser %}
<!-- Only superusers can view things in here -->
{% endif %}