在Django中创建员工用户

时间:2015-06-08 14:15:04

标签: python django

我正在尝试使用

在Django中创建一个staff用户
UserModel.objects.create_user(username="A", email="a@a.com", password="a", is_staff=True)

但是在https://github.com/django/django/blob/master/django/contrib/auth/models.py的Django的UserManager中,它说

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, username, email, password,
                     is_staff, is_superuser, **extra_fields):
        """
        Creates and saves a User with the given username, email and password.
        """
        if not username:
            raise ValueError('The given username must be set')
        email = self.normalize_email(email)
        user = self.model(username=username, email=email,
                          is_staff=is_staff, is_superuser=is_superuser,
                          **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, username, email=None, password=None, **extra_fields):
        return self._create_user(username, email, password, False, False,
                                 **extra_fields)

    def create_superuser(self, username, email, password, **extra_fields):
        return self._create_user(username, email, password, True, True,
                                 **extra_fields)

因此,在尝试设置is_staff = False时,除非我使用is_staff = True代替create_superuser,否则它将始终使用create_user覆盖此字段;但是,create_superuser也设置了is_superuser = True

他们忘了在Django中创建方法create_staff_user吗? : - )

2 个答案:

答案 0 :(得分:6)

不,我不认为'他们'忘记了create_staff_method。

这是产生_create_user方法的pull request,其原因是:

  

创建超级用户时不要两次引发db信号

create_user和create_superuser方法都使用相同的私有方法。理解这一点,并且知道Python中没有真正的私有方法,可以直接使用_create_user。但这是一个丑陋的选择。

为方便起见,create_user方法是额外的方法。你用is_staff=True调用它是正确的,不会给出预期的结果。我认为这是真正的错误。错误是:

  

TypeError:_create_user()获得了关键字参数的多个值   'is_staff'

您的代码(用户名是位置参数):

User.objects.create_user('john', email='lennon@thebeatles.com', password='johnpassword', is_staff=True)

有关创建用户的文档建议:

user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')  
user.is_staff=True 
user.save()

但是这种方式我们称两次保存。 :/

UserManager是BaseUserManager的子类,它是Manager的子类。所以你也可以这样做:

email = normalize_email('lennon@thebeatles.com')
user = User.objects.create(username='john',
    email=email, is_staff=True )
user.set_password(password)
user.save()

因为显式优于隐式,简单优于复数...我会选择最基本和简单的User.objects.create。或者等待https://code.djangoproject.com/ticket/25009降落。

答案 1 :(得分:-5)

那是故意的。只有匿名用户为is_staff=False。所有已保存的用户必须是员工或超级用户。更多信息。 here