Python 为什么自定义用户密码没有设置和验证?

Python 为什么自定义用户密码没有设置和验证?,python,django,Python,Django,我认为用电子邮件交换用户模型的用户名是轻而易举的事。所以我使用的是CustomUser 从django.contrib.auth.models导入AbstractUser 从django.db导入模型 从django.utils.translation导入ugettext\u lazy作为_ 从.managers导入UserManager 类CustomUser(AbstractUser): “”“用户模型。”“” 用户名=无 email=models.EmailField(quo('email

我认为用电子邮件交换用户模型的用户名是轻而易举的事。所以我使用的是
CustomUser

从django.contrib.auth.models导入AbstractUser
从django.db导入模型
从django.utils.translation导入ugettext\u lazy作为_
从.managers导入UserManager
类CustomUser(AbstractUser):
“”“用户模型。”“”
用户名=无
email=models.EmailField(quo('email address'),unique=True)
用户名\字段='电子邮件'
必填_字段=[]
objects=UserManager()
由于
CustomUser
是从
AbstractUser
model
继承而来的,我认为我已经完成了,但我想我离它还很远

下面是我的django shell交互:

>来自django.contrib.auth导入get\u user\u模型
>>User=get\u User\u model()
>>User.objects.create(电子邮件)dave@gmail.com“,密码='123')
>>User.objects.get(email=)dave@gmail.com)。密码
“123”#沃特?为什么这是明文?
>>User.objects.get(email=)dave@gmail.com)。设置密码('abc')
>>User.objects.get(email=)dave@gmail.com)。密码
“123”#还是一样!
所以在功能上,这是完全无用的。由于用户的
django.contrib.auth.authenticate
始终返回
None
。我做错了什么?我如何实现我的
CustomUser
与默认的django用户模型不同的最小功能,因为我的
CustomUser
应该使用电子邮件作为用户名

我已经查看了SO的点击率:

编辑:我使用以下内容作为我的
UserManager

从django.contrib.auth.models导入BaseUserManager
类UserManager(BaseUserManager):
“”“为没有用户名字段的用户模型定义模型管理器。”“”
在_迁移中使用_=True
定义创建用户(自我、电子邮件、密码、**额外字段):
“”“使用给定的电子邮件和密码创建并保存用户。”“”
如果不是电子邮件:
raise VALUERROR('必须设置给定的电子邮件')
电子邮件=自我规范化电子邮件(电子邮件)
user=self.model(email=email,**额外字段)
user.set_密码(password)
user.save(使用=self.\u db)
返回用户
def create_user(自我、电子邮件、密码=无,**额外_字段):
“”“使用给定的电子邮件和密码创建并保存普通用户。”“”
额外字段。setdefault('is_staff',False)
extra_fields.setdefault('is_superuser',False)
返回自我。创建用户(电子邮件、密码、**额外字段)
def create_超级用户(自我、电子邮件、密码、**额外_字段):
“”“使用给定的电子邮件和密码创建并保存超级用户。”“”
额外字段。setdefault('is_staff',True)
extra_fields.setdefault('is_superuser',True)
如果extra_fields.get('is_staff')不正确:
raise VALUERROR('超级用户必须具有is\u staff=True')
如果extra_fields.get('is_superuser')不为True:
raise VALUE ERROR('超级用户必须具有is\U Superuser=True')
返回自我。创建用户(电子邮件、密码、**额外字段)

您可以使用
User.objects.create(email=)dave@gmail.com“,password='123')
创建您的用户
.create()
没有考虑密码需要散列(这是所有型号提供的正常方法)。改为使用
。创建用户()

您还尝试通过写入以下内容来设置用户密码:

User.objects.get(email='dave@gmail.com').set_password('abc')
这不起作用,因为
set\u password
不会将任何内容保存到数据库中。您应该这样做:

user = User.objects.get(email='dave@gmail.com')
user.set_password('abc')
user.save()

如何注册/创建用户?另外,
set\u password
不会自然地保存用户
user.objects.get(email=)dave@gmail.com)。设置密码('abc')
不会更改任何内容。尝试类似于
user=user.objects.get(email=)的方法dave@gmail.com“)
然后是
用户。设置密码('abc')
然后是
用户。保存()
。嗯,我不知道为什么
创建用户()缺少一个必需的位置参数:“username”
@DaveIdito您设置了
验证用户模型='yourapp.CustomUser
?对不起,我的错。这是正确的答案。我正在调试,结果证明我的
objects=UserMa…
行是值得推荐的。现在一切都好了。
user = User.objects.get(email='dave@gmail.com')
user.set_password('abc')
user.save()