Python 如何在AbstractBaseUser中更改用户密码

Python 如何在AbstractBaseUser中更改用户密码,python,django,Python,Django,在创建MyUser的过程中,我做了以下几点: 我想更改用户的密码 我尝试: 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_activ

在创建MyUser的过程中,我做了以下几点:

我想更改用户的密码

我尝试:

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()

“通过电子邮件发送”密码不允许我登录,并且我无法在控制台中进行身份验证。

原因与发送电子邮件无关,但与我错误使用表单方法有关

这是基本表单中的工作解决方案,无需发送电子邮件,也无需以某种随机方式生成新密码来让其他人清楚,在AbstractBaseUser的情况下,他们在调用表单保存时会遇到同样的设置密码问题

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

您没有显示失败的身份验证。请粘贴一个完整的Python会话,在该会话中,您可以显示设置密码'abcd',后跟验证器'abcd'实际上失败。这与您前面的问题重复:。如果您需要添加更多详细信息,请编辑您现有的问题,而不是针对同一问题发布新问题。@Ianzz请注意:在模型中尝试内容和在形式中尝试内容之间的区别。@andi所以您以前的问题已经解决,这是一个完全无关的问题?我删除了第二个问题。这个案子对我来说更有趣,而且可能更容易解决。
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
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