【问题标题】:Django form to change passwordDjango 表单更改密码
【发布时间】:2014-01-17 10:17:45
【问题描述】:

当用户成功登录并进入首页后,有一个“更改密码”链接,用于更改密码。显示一个更改密码的表单,其中包含三个输入框,旧密码,新密码确认新密码

这是我的代码。

forms.py

class reset_form(forms.Form):


    oldpassword = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'your old Password',  'class' : 'span'}))
    newpassword1 = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'New Password',  'class' : 'span'}))
    newpassword2 = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'Confirm New Password',  'class' : 'span'}))


    def clean(self):
        if 'newpassword1' in self.cleaned_data and 'newpassword2' in self.cleaned_data:
            if self.cleaned_data['newpassword1'] != self.cleaned_data['newpassword2']:
                raise forms.ValidationError(_("The two password fields did not match."))
        return self.cleaned_data

views.py


def change_password(request):

    if request.method == 'POST':
        form = reset_form(request.POST)
        if form.is_valid():
            newpassword=form.cleaned_data['newpassword1'],
            username=request.user.username
            password=request.user.password

            user = authenticate(username=username, password=password)
            if user is not None:
                user.set_password(newpassword)
                user.save()
                return HttpResponseRedirect('/reset/success/')

            else:
                return render(request, 'reset_password.html',{'error':'You have entered wrong old password','form': form})

        else:
           return render(request, 'reset_password.html',{'error':'You have entered old password','form': form})
    else:
        form = reset_form()
    content = RequestContext(request, {'form': form})  
    return render(request, 'reset_password.html', content,)

使用正确的旧密码提交表单后,我收到此消息您输入了错误的旧密码我不知道为什么我收到此错误消息,请帮助解决此代码

【问题讨论】:

标签: django django-forms django-views


【解决方案1】:

由于某种原因,您通过request.user 使用存储在数据库中的密码字段,而不是他们实际在表单中输入的密码字段。数据库版本是散列的,当你调用authenticate时它会再次散列它,所以匹配失败。

您应该使用用户在表单中输入的值:

username = request.user.username
password = form.cleaned_data['oldpassword']

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

【讨论】:

  • 感谢 Daniel 的回答,这对我很有帮助。但是现在我遇到了另一个问题,我的密码已更改为其他文本。现在我的密码既不是旧密码也不是我提供的新密码。我该怎么办?
  • 你是如何确定的?不要忘记,正如我在答案中提到的,密码是存储在数据库中的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 2023-03-23
  • 2019-09-25
  • 2020-10-15
相关资源
最近更新 更多