【问题标题】:Roles in DjangoDjango 中的角色
【发布时间】:2021-02-17 03:10:59
【问题描述】:

我正在创建基于 Web 的系统,其中我有 5 或 6 个不同的角色和访问类型。我对如何实现这一点进行了研究,只有在 django admin 中创建组并将用户分配到其中时才完成所有操作,但只能从管理部分进行。我需要从视图中创建它。我已经有一个表单来添加用户的电子邮件和下拉菜单来设置角色类型。

任何建议都将不胜感激,因为到目前为止,我不知道如何在不从 django admin 分配用户的情况下实现这一点。

我的 model.py 供用户使用:

class CustomUserManager(BaseUserManager):
    """
    Custom user model manager where email is the unique identifiers
    for authentication instead of usernames.
    """
    def create_user(self, email, password, **extra_fields):
        """
        Create and save a User with the given email and password.
        """
        if not email:
            raise ValueError(_('The Email must be set'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(email, password, **extra_fields)


class CustomUser(AbstractUser):

    username = None
    email = models.EmailField(_('email address'), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

    ADMIN = 1
    RECEPTION = 2
    HEADOFDEPARTMENT = 3
    EMPLOYEE = 4
    PATIENT = 5
    NOTACTIVE = 6

    ROLE_CHOICES = (
        (ADMIN, 'Admin'),
        (RECEPTION, 'Reception'),
        (HEADOFDEPARTMENT, 'HeadOfDepartment'),
        (EMPLOYEE, 'Employee'),
        (PATIENT, 'Patient'),
        (NOTACTIVE, 'NotActive'),
      )
    role                            = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, blank=True, default=True, null=True)
    #email                           = models.EmailField(verbose_name="email", max_length=60, unique=True) 
    username                        = models.CharField(max_length=30, blank=True, default='')
    is_superuser                    = models.BooleanField(default=True)
    is_admin                        = models.BooleanField(default=True)
    is_employee                     = models.BooleanField(default=True)
    is_headofdepartment             = models.BooleanField(default=True)
    is_reception                    = models.BooleanField(default=True)
    is_patient                      = models.BooleanField(default=True)
    is_active                       = models.BooleanField(default=True)
    is_staff                        = models.BooleanField(default=True)

【问题讨论】:

    标签: django permissions roles python-3.8 django-2.2


    【解决方案1】:

    喜欢这个

    from django.contrib.auth.models import Group
    
    def ViewFunc(request):
        ... #your func
        role = Group.objects.get(name='role') 
        role.user_set.add(user)
    

    您以您想要的方式在视图中检索用户对象,将其添加到组中的用户集中,完成。

    编辑 将用户Foo 添加到Admins 组。

    from django.contrib.auth.models import Group, User
    
    
    def ViewFunc(request):
        user = User.objects.get(username = 'Foo')
        role = Group.objects.get(name='Admins') 
        role.user_set.add(user)
    

    【讨论】:

    • 我是否需要先从 django 管理面板创建组,或者就像我在问题中的模型中所做的那样?这些代码应该在模型中还是在视图中? name='role' 角色应该是模型中的字段吧?你能解释一下代码吗?
    • @pythondev 你要么通过管理员创建组,要么通过代码创建组,这段代码应该在视图中,因为我清楚地说ViewFunc这是你要编写的视图函数,@987654326 @ 只是组名的占位符,您创建一个名为AdminsReception 的组,然后通过role = Group.objects.get(name='Admins') 检索它,然后添加用户。
    • 这个 ViewFunc 对我来说不是很清楚它的用途。我想我应该将 role = Group.objects.get(name='role') role.user_set.add(user) 添加到我想要限制的每个函数中,但是当我遇到错误时,我认为我没有理解正确跨度>
    • ViewFunc 是一个占位符,您可以在 views.py 中写任何您想要的内容,通过表单或通过 url 或任何您想要的方式检索用户,我将编辑答案以告诉您如何通过用户名检索它。
    • @pythondev 编辑了答案,您问如何将用户添加到组,我回答了,如果您还有问题,请编辑您的问题。
    猜你喜欢
    • 2019-11-16
    • 2010-12-05
    • 2023-03-15
    • 2016-01-31
    • 2022-01-23
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多