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