当我完成我的用户名和密码后,此错误爆炸了,他写道用户名和密码不匹配,但是所有数据都是valide and True!如何修复它?如何检查密码,如果数据库中的密码以加密形式存储,以及以字符串形式提供的密码!
谢谢大家的帮助,我将期待您的建议!
forms.py
class UserLogInForm(forms.Form):
username = forms.RegexField(regex=r'^w+$', widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Username"), error_messages={ 'invalid': _("This value must contain only letters, numbers and underscores.") })
password = forms.CharField(widget=forms.PasswordInput(attrs=dict(required=True, max_length=30, render_value=False)), label=_("Password"))
def clean_username(self):
user = User.objects.get(username__iexact=self.cleaned_data['username'])
if user:
return self.cleaned_data['username']
else:
raise forms.ValidationError('This user does not exist!')
def clean(self):
username = self.cleaned_data['username']
password = self.cleaned_data['password']
user = User.objects.filter(username=username)
if user.count() == 1:
user = user.first()
if user.check_password(password):
raise forms.ValidationError("Incorrect password!")
return self.cleaned_data
else:
raise forms.ValidationError('This user does not exist!')
views.py
def login_view(request):
form = UserLogInForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data['username'],
password = form.cleaned_data['password'],
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('/')
else:
return redirect('accounts/login')
context = {'form':form}
return render(request, 'accounts/registration/login.html', context)
当check_password()
返回true时,您正在提高错误。
我建议您可以重写这样的方法,
def clean(self, *args, **kwargs):
username = self.cleaned_data.get("username")
password = self.cleaned_data.get("password")
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise forms.ValidationError("This user does not exist!")
if user and not user.check_password(password):
raise forms.ValidationError("Incorrect password!"):
if user and not user.is_active:
raise forms.ValidationError("This user is no longer active.")
return super(UserLogInForm, self).clean(*args, **kwargs)
另外,在您视图中从这些线中删除尾随逗号,
username = form.cleaned_data['username']
password = form.cleaned_data['password']
由于落后逗号,python返回元组而不是弦。