5

ユーザーが username 経由でのみログインできるようにするフォームがあります。ユーザー名ではなく、電子メール経由でのログインのみを許可することにしました。

まず、これは電子メールによるログ記録に関連する質問の重複ではありません。私のシナリオでは、ユーザーforms.pyがビューで最終ログインに進む前にユーザーを検証して認証するため、ログイン パスワードが正しくない場合にエラーが発生する可能性があるからです。等

私が直面している問題はforms.py、メールが存在しない場合にエラーを発生させるように変更しましたが、ユーザーは自分のメール経由でログインできません。

 def LoginRequest(request):
     form = LoginForm(request.POST or None)    
     if request.POST and form.is_valid():
         user = form.login(request)
         if user:
             login(request, user)
             return HttpResponseRedirect(reverse('Hello'))

     return render(request, 'login.html',{'form': form})

これは、ユーザーがユーザー名を介してのみログインできるようにする私のオリジナルのコードです

 class LoginForm(forms.Form):
     username = forms.CharField()
     password = forms.CharField(
        widget=forms.PasswordInput(render_value=False)
        )

     def clean(self):        
         username = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')
         user = authenticate(username=username, password=password)
         if not user or not user.is_active:
             raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
         return self.cleaned_data

     def login(self, request):
         username = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')
         user = authenticate(username=username, password=password)
         return user

これは、ユーザーが電子メール経由でのみログインできるように修正したコードです。どうしようかといろいろ考えましたが、これが一番いい案です。すみません、少し混乱しています。問題は、ユーザーがログインできないことです。理由がわかりません。

 class LoginForm(forms.Form):
     username = forms.CharField()
     password = forms.CharField(
            widget=forms.PasswordInput(render_value=False)
        )

     def clean(self):       
         user = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')

         if User.objects.filter(email=user).exists():
             password = self.cleaned_data.get('password')
             user = authenticate(username=user.username, password=password)
             if not user or not user.is_active:
                 raise forms.ValidationError("Sorry, that login was invalid. Please try again.")
             return self.cleaned_data

     def login(self, request):
         username = self.cleaned_data.get('username')
         password = self.cleaned_data.get('password')
         user = authenticate(username=username, password=password)
         return user

誰か助けてくれませんか?

4

3 に答える 3

1

2 つの異なるフィールドに対してテストしているようです。あなたは電子メールに対してユーザーを探します

if User.objects.filter(email=user).exists():

ただし、ユーザー名に対して検証します

user = authenticate(username=user, password=password)

メールアドレスを使用している場合、認証行は

user = authenticate(email=user, password=password)
于 2013-05-18T15:09:35.350 に答える