Python 扩展UserCreationForm:未保存密码
我已成功创建并扩展了Python 扩展UserCreationForm:未保存密码,python,django,Python,Django,我已成功创建并扩展了用户创建表单以获取电子邮件,名字&姓氏。它可以很好地插入所有值。但是我认为密码字段没有被保存。我正在使用内置的auth对象对登录到我的站点的用户进行身份验证。当用户在站点中注册并尝试登录时,密码不匹配,用户无法登录。当我从admin更改密码时,我可以成功登录。有人能帮我吗? 这就是我如何扩展UserCreationForm: from django import forms from django.contrib.auth.forms import User from dja
用户创建表单
以获取电子邮件
,名字
&姓氏
。它可以很好地插入所有值。但是我认为密码
字段没有被保存。我正在使用内置的auth
对象对登录到我的站点的用户进行身份验证。当用户在站点中注册并尝试登录时,密码不匹配,用户无法登录。当我从admin
更改密码时,我可以成功登录。有人能帮我吗?
这就是我如何扩展UserCreationForm
:
from django import forms
from django.contrib.auth.forms import User
from django.contrib.auth.forms import UserCreationForm
class RegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
first_name = forms.TextInput()
last_name = forms.TextInput()
class Meta:
model = User
fields = ("username", "first_name", "last_name", "email", "password1", "password2")
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
if commit:
user.save()
return user
现在,我点击表单链接,更改密码。问题
您的代码正在调用UserCreationForm
的super,而不是您自己的表单RegistrationForm
的super。(超级用户创建表单UserCreationForm
beingModelForm
不知道如何像保存密码一样处理用户注册)
结果是没有在任何地方调用user.set\u password()
但是,我想说的是,不需要再呼叫用户。再次设置密码,因为您的super
已经设置了密码
UserCreationForm.save()
的定义如下:
def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
解决方案
你应该有这样的东西
def save(self, commit=True):
# Call save of the super of your own class,
# which is UserCreationForm.save() which calls user.set_password()
user = super(RegistrationForm, self).save(commit=False)
# Add the things your super doesn't do for you
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
if commit:
user.save()
return user
出于好奇,您如何更改管理员的密码?您是否将密码直接输入字段?还是密码重置程序?谢谢!但是你能解释一下为什么密码是用email
字段保存的,而不是用我以前的代码使用的其他字段。我非常怀疑这与“email only”有什么关系,因为你的密码在数据库中是空的,很明显问题出在用户身上。_set_password没有在任何地方被调用(手动或通过super)。可能您忘记了您在尝试电子邮件时添加了用户。设置密码()
仅版本:P
def save(self, commit=True):
# Call save of the super of your own class,
# which is UserCreationForm.save() which calls user.set_password()
user = super(RegistrationForm, self).save(commit=False)
# Add the things your super doesn't do for you
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
if commit:
user.save()
return user