我有一个只允许用户通过 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
有人可以帮帮我吗?