如何在 Django 中更新密码?

Gus*_*san 6 python django

我想从模板编辑我的用户数据,下面是我的代码。

def guru_edit(request, id):
   Guru = get_object_or_404(DataGuru, GuruUser_FK_id=id)
   GuruUser = get_object_or_404(User, id=id)
   if request.method == 'POST':
       form_guru = dataguruform(request.POST, instance=Guru)
       form_user = userform(request.POST, instance=GuruUser)
       if form_guru.is_valid() and form_user.is_valid():
           form_guru.save()
           form_user.save()
           return redirect('index_guru')
   else:
       form_guru = dataguruform(instance=Guru)
       form_user = userform(instance=GuruUser)
  return render(request, 'guru/guru_tambah.html', {'form_user': form_user,'form_guru':form_guru})
Run Code Online (Sandbox Code Playgroud)

这是我的forms.py

class userform(ModelForm):
    class Meta:
       model = User
       fields = ('username','email', 'password','is_staff','is_active','is_superuser')
    widgets={
    'password':TextInput(attrs={'type':'password'})
    }
Run Code Online (Sandbox Code Playgroud)

但是当我从模板中保存时,密码不像以前那样加密,而是明文。怎么让它铭文?

Ale*_*kli 14

不要通过表单字段设置密码。使用User.set_password()接受未加密密码的方法设置密码:

user_form = UserForm(request.POST, instance=user)
if form.is_valid():
    user = user_form.save()
    user.set_password('unencrypted_password')  # replace with your real password
    user.save()
    return redirect('index_guru')
Run Code Online (Sandbox Code Playgroud)

如您所见,我在这里以更像 Django 的方式命名了变量和表单。

背景:Django 中的密码作为(最常见的 PBKDF2)哈希存储在您的数据库中。set_password负责寻找正确的散列方法并正确地对密码进行加盐和散列。

表单应仅包含用于检查您的用户是否正确输入他或她的密码的类似passwordpassword_check字段的内容。它们不应该用于将普通密码保存到您的数据库中,我怀疑默认情况下会发生这种情况。

您也可以set_password通过覆盖该UserForm.save()方法在表单中使用。

花点时间通读本文档:

https://docs.djangoproject.com/en/dev/topics/auth/passwords/