如何更改AbstractBaseUser中用户的密码

2 投票
1 回答
1199 浏览
提问于 2025-04-18 01:01

在创建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

撰写回答