Python 覆盖身份验证模块';s AuthenticationForm允许通过电子邮件登录
我想让我的用户能够通过电子邮件登录。我见过通过编写自定义身份验证后端来实现这一点的示例。一、 但是,您希望通过继承Python 覆盖身份验证模块';s AuthenticationForm允许通过电子邮件登录,python,django,inheritance,django-forms,django-authentication,Python,Django,Inheritance,Django Forms,Django Authentication,我想让我的用户能够通过电子邮件登录。我见过通过编写自定义身份验证后端来实现这一点的示例。一、 但是,您希望通过继承django.contrib.auth.forms.AuthenticationForm并添加一个名为email的新字段来实现这一点,该字段在clean_email方法上从用户模型获取用户名,然后将其传递给父表单 我尝试过这样做,但失败得很惨,因为我似乎无法修改请求或填充字段值。这就是我到目前为止所得到的 class LoginForm(AuthenticationForm):
django.contrib.auth.forms.AuthenticationForm
并添加一个名为email
的新字段来实现这一点,该字段在clean_email
方法上从用户
模型获取用户名,然后将其传递给父表单
我尝试过这样做,但失败得很惨,因为我似乎无法修改请求或填充字段值。这就是我到目前为止所得到的
class LoginForm(AuthenticationForm):
email = forms.EmailField(
required=True, label=_("Email")
)
def __init__(self, request=None, *args, **kwargs):
super(LoginForm, self).__init__(
request, *args, **kwargs
)
self.fields['username'].widget = forms.widgets.HiddenInput()
def clean_email(self):
user = User.objects.filter(email=self.cleaned_data['email'])
if user:
#self.fields['username'].value = user.username
#return user.email
else:
raise forms.ValidationError(_("Incorrect email or password."))
谢谢。如果要修改另一个字段,应使用
clean
:
def clean(self):
cleaned_data = self.cleaned_data
user = User.objects.filter(email=cleaned_data['email'])
if user:
cleaned_data['username'] = user.username
else:
raise forms.ValidationError(_("Incorrect email or password."))
return cleaned_data
别忘了电子邮件在Django auth中并不是唯一的。您可以尝试类似的方式(未经测试):
class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super(LoginForm, self).__init__(*args, **kwargs)
self.fields['username'].label = u'E-mail'
def clean_username(self):
# get user from e-mail address, minding possible exceptions
return user.username