我正在尝试使用
在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
吗? : - )
答案 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