Python 在Django中创建staff用户

Python 在Django中创建staff用户,python,django,Python,Django,我正在尝试使用创建Django中的staff用户 UserModel.objects.create_user(username="A", email="a@a.com", password="a", is_staff=True) 但在Django的UserManager中,它说 因此,当尝试设置is_staff=False时,它将始终使用is_staff=True覆盖此字段,除非我使用create_superuser而不是create_user;但是,create\u superuser还设置

我正在尝试使用创建Django中的staff用户

UserModel.objects.create_user(username="A", email="a@a.com", password="a", is_staff=True)
但在Django的UserManager中,它说

因此,当尝试设置
is_staff=False
时,它将始终使用
is_staff=True
覆盖此字段,除非我使用
create_superuser
而不是
create_user
;但是,
create\u superuser
还设置
is\u superuser=True


他们是否忘记在Django中创建方法
create_staff\u user
?:-)

那是故意的。只有匿名用户是
is\u staff=False
。所有保存的用户必须是职员或超级用户。更多信息

不,我不认为“他们”忘记了create\u staff\u方法

这就是产生
\u create\u user
方法的原因,其原因是:

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

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

为了方便起见,create_user方法是额外的方法。用
is_staff=True
调用它不会得到预期的结果,这是对的。我认为这才是真正的错误。错误是:

TypeError:_create_user()为关键字参数获取了多个值 “是教职员吗?”

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

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

user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')  
user.is_staff=True 
user.save()
但这样一来,我们会叫save两次/

UserManager是BaseUserManager的子类,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
。或者等待着陆。

Django核心团队非常乐于接受请求,因此请不要害怕提交请求。您始终可以选择对该用户进行
。更新
。我打开了一张记录单,这是提交:这不是真的。你是对的,匿名用户总是有假的,但是经过身份验证的用户可以是真的,也可以是假的。问的问题是关于创建用户。你说的“那个命令”是什么意思?当用户被创建时,他们不再是匿名的,所以你引用的文档不再适用。你是对的,如果你给is\U员工,创建用户将不起作用。功能或错误。。。这就是问题所在。没有多少项目需要以编程方式创建人员。更不用说使用modelMangers创建用户。有很多其他方法可以通过is_员工创建用户,而不会碰到这个功能/缺陷。我想这不是一个缺陷,只是一个功能/约定:)谢谢。但是,当我用你上次的建议创建用户时,密码设置似乎不正确。是的,电子邮件没有正常化。更新了答案。
user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')  
user.is_staff=True 
user.save()
email = normalize_email('lennon@thebeatles.com')
user = User.objects.create(username='john',
    email=email, is_staff=True )
user.set_password(password)
user.save()