【问题标题】:Create a new password in django在 django 中创建一个新密码
【发布时间】:2026-01-26 08:40:01
【问题描述】:

我有如下密码更改表格

forms.py

class PasswordChangeForm(forms.Form):
    old_password = forms.CharField(widget=forms.PasswordInput())
    new_password = forms.CharField(widget=forms.PasswordInput())
    confirm_password = forms.CharField(widget=forms.PasswordInput())

    def clean(self):
        if self.cleaned_data['new_password'] != self.cleaned_data['confirm_password']:
            raise forms.ValidationError(_('The new passwords must be same'))
        else:
            return self.cleaned_data

template.html

<form action="/save/data/" method="post">
   <div>
      <p>{{form.old_password}}</p>
      <span>{{form.old_password.errors}}</span>
   </div>
   <div>
      <p>{{form.new_password}}</p>
      <span>{{form.new_password.errors}}</span>
   </div>
   <div>
       <p>{{form.confirm_password}}</p>
      <span>{{form.confirm_password.errors}}</span>
   </div>
</form>

views.py

@login_required 
def change_password(request):
    user_obj = User.objects.get(id=request.user.id)
    form = PasswordChangeForm()
    if request.method=="POST":
        form = PasswordChangeForm(reques.POST)
        #########
        Here in this part i need to check if the user given old passoword
        matched the already saved password in the database, create a password
        with the user given new password
        #########
        new_password = form.cleaned_data['new_password']
        ......
        user_obj.password = new_password 
        ..........
    return render_to_response('template.html',{'form':form})       

那么在上面的代码中,我们如何使用用户提供的旧密码来检查保存在数据库中的密码呢?以及如何创建新密码并存入数据库?

发送邮件给用户后,您的密码已成功更改

【问题讨论】:

    标签: python django change-password


    【解决方案1】:

    你有用户对象。所以你可以称之为set_password 方法。

    request.user.set_password(password) 
    

    此外,您无需再次从数据库中获取用户。您正在发出不必要的数据库请求。 request.user 是用户。

    我会像这样重写整个视图,

    from django.shortcuts import render
    
    @login_required 
    def change_password(request):
    form = PasswordChangeForm(request.POST or None)
    if form.is_valid()
        if request.user.check_password(form.cleaned_data['old_password']):
            request.user.set_password(form.cleaned_data['new_password'])
            request.user.save()
            return render(request, 'success.html')
    return render(request, 'template.html', {'form':form})
    

    这意味着如果有 POST 数据,您可以使用它来初始化表单。否则它会得到None。如果表单有效(空表单永远不会),那么您更改密码并将其发送到成功页面。否则,您将空表单(或带有验证错误的表单)返回给用户。

    【讨论】:

    • 如何检查用户输入的旧密码是否与数据库中的密码匹配?
    • 你的视图用login_required装饰,但你只使用check_password方法
    • 您无法检查新密码是否与旧密码匹配,因为它们默认使用加盐哈希加密...
    • 是的,您只需使用检查密码即可。盐与哈希一起存储在数据库中。加盐哈希用于防止对泄露数据的彩虹表攻击。不是为了防止给定的密码是否与存储在数据库中的 hash + salt 匹配。
    • 你不应该得到request.POST or None,如果你得到None,下一行将失败:form.is_valid()
    【解决方案2】:

    您可以通过 check_password 方法检查。

    if request.user.check_password(form.cleaned_data['old_password']):
        request.user.set_password(form.cleaned_data['new_password'])
        request.user.save()
    

    【讨论】: