Завершение AuthticationForm модуля auth, чтобы разрешить вход по электронной почте - PullRequest
0 голосов
/ 25 июля 2011

Я бы хотел, чтобы мои пользователи могли войти в систему по электронной почте.Я видел примеры выполнения этого путем написания пользовательского интерфейса аутентификации.Однако я хотел бы сделать это, унаследовав django.contrib.auth.forms.AuthenticationForm и добавив новое поле с именем email, которое в методе clean_email извлекает имя пользователя из модели User и затем передает его в родительскую форму.

Я пытался сделать это, но я потерпел неудачу, так как не могу изменить запрос или заполнить значение поля.Это то, что я получил до сих пор.

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."))

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Вы должны использовать 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.

0 голосов
/ 25 июля 2011

Вы можете попробовать что-то вроде этого (не проверено):

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
...