如何更改AbstractBaseUser中用户的密码
在创建MyUser的时候,我是按照这个链接的内容进行的:
https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#a-full-example
我想要更改用户的密码。
我尝试了:
In [55]: i=FairsUser.objects.get(email="admin@andilabs.com")
In [56]: i.__dict__
Out[56]:
{'_state': <django.db.models.base.ModelState at 0x110a53490>,
'email': u'admin@andilabs.com',
'id': 8,
'is_active': True,
'is_admin': False,
'is_superuser': False,
'last_login': datetime.datetime(2014, 4, 2, 16, 0, 59, 109673),
'mail_sent': False,
'password': u'pbkdf2_sha256$12000$XgszxXkXbroY$PEEf3vqszclGcf7iQXeZRWDTYcCsvlGh0jH15f6rKR8='}
In [57]: i.set_password("abcd")
In [58]: i.save()
然后我检查了一下:
In [59]: i_updated=FairsUser.objects.get(email="admin@andilabs.com")
In [60]: i_updated.__dict__
Out[60]:
{'_state': <django.db.models.base.ModelState at 0x110a53590>,
'email': u'admin@andilabs.com',
'id': 8,
'is_active': True,
'is_admin': False,
'is_superuser': False,
'last_login': datetime.datetime(2014, 4, 2, 16, 0, 59, 109673),
'mail_sent': False,
'password': u'pbkdf2_sha256$12000$8VCDlzTuVfHF$ldwqbXo/axzMFLasqOKkddz8o1yW9d5r7gUxD3qH4sU='}
虽然加密后的密码值不同,但我还是无法用“abcd”登录。这是什么原因呢?
好的,在这种情况下,它“开始”工作了。但是在我的管理表单逻辑中,它仍然不行:
def clean(self, commit=True):
super(UserChangeForm, self).clean()
cleaned_data = self.cleaned_data
old_status = FairsUser.objects.get(email=cleaned_data['email'])
if (old_status.mail_sent is False or old_status.mail_sent is None) and cleaned_data['mail_sent'] is True:
usr = FairsUser.objects.get(email=cleaned_data['email'])
new_pass = ''.join(
random.choice(
string.ascii_uppercase + string.digits
) for _ in range(DESIRED_PASSWORD_LENGTH))
usr.set_password(new_pass)
usr.save()
mail_content = 'Hi! Bbelow are your login credentials.\n e-mail: {0} \n password: {1} \n Have nice time on fairs! \n'.format(usr.email, new_pass)
msg = EmailMessage('Your login data', mail_content, 'from@andilabs.com', [usr.email, ])
msg.send()
return cleaned_data
通过邮件发送的密码让我无法登录,而且我在控制台中也无法进行身份验证。
1 个回答
1
问题的原因并不是和发送邮件有关,而是我错误地使用了表单的方法。
这是一个基本的解决方案(没有发送邮件,也没有以随机方式生成新密码),目的是让其他遇到同样问题的人更清楚,尤其是在使用AbstractBaseUser时,调用表单的save()方法时设置密码的问题。
def save(self, commit=True):
user = super(UserChangeForm, self).save(commit=False)
cleaned_data = self.cleaned_data
old_status = FairsUser.objects.get(email=cleaned_data['email'])
if (old_status.mail_sent is False or old_status.mail_sent is None) and cleaned_data['mail_sent'] is True:
new_pass = "SOME_NEW_VALUE_OF_PASSWORD"
user.set_password(new_pass)
# here sending email can be initiated
if commit:
user.save()
return user