我是Django的新手,所以我很感激能得到的任何帮助。我刚刚创建了一个可以更改用户名,电子邮件和密码的表单。目前,当我使用该表单保存新密码时,它会被散列并存储,这是所需的行为。但是,当我登录时,因为我使用了未加密的密码,authenticate()函数无法检索用户而我无法登录。
请注意,如果我使用哈希版本的密码登录,则可以使用。但是我不需要使用密码版本的密码来登录。那么有没有办法在不使用密码版本的情况下登录?
class UserProfileForm(UserChangeForm):
password = forms.CharField(required=False, widget=forms.PasswordInput)
class Meta:
model = User
fields = ('username','email','password',)
def clean_password(self):
return ""
def change_profile_settings(request):
settings_changed = False
if request.method == 'POST':
user_form = UserProfileForm(request.POST, instance=request.user)
if user_form.is_valid():
# user.password is hashed
user.set_password(user.password)
user.save()
settings_changed = True
else:
print user_form.errors
else:
user_form = UserProfileForm(instance=request.user)
return render(request,
'/profile.html',
{'user_form': user_form, 'settings_changed': settings_changed} )
def user_login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
# password is not hashed and therefore fails authenticate
# it cannot retrieve user so it goes to the else block
user = authenticate(username=username,password=password)
if user:
if user.is_active:
login(request,user)
return HttpResponseRedirect('/')
else:
message="disable"
return render(request,'/login.html',{"message":message})
else:
message="invalid"
return render(request,'/login.html',{"message":message})
else:
message="work"
return render(request,'/login.html',{"message":message})
答案 0 :(得分:3)
我认为您的个人资料表格不匹配......
您的UserProfileForm
clean_password
返回''字符串。这不应该是这样的。
并且change_profile_settings
方法user.set_password(user.password)
参数应为表单密码字段,即user_form.cleaned_data['password']
答案 1 :(得分:1)
如果您想通过将纯文本密码与数据库中的散列密码进行比较来手动验证用户身份,请使用便捷功能check_password()
。它需要两个参数:
如果匹配则返回True,否则返回False。