【问题标题】:django - cannot save password correctly in formdjango - 无法在表单中正确保存密码
【发布时间】:2018-04-25 16:13:23
【问题描述】:

我正在尝试创建一个允许用户更改密码的表单。

每次修改密码都无法登录。 例如如果密码是“jake”,我改成“jake1”,我不能用密码“jake1”甚至“jake”登录

表单如下所示: https://imgur.com/a/MdPs0

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/views.py

@login_required(login_url='/employee/sign-in/')

def employee_account(request):

    employee_form = EmployeeFormEdit(instance = request.user)

    if request.method == "POST":
        employee_form = EmployeeFormEdit(request.POST, instance = request.user)

        if employee_form.is_valid():
            employee_form.save()

    return render(request, 'employee/account.html', {
        "employee_form":employee_form
        })

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/forms.py

class EmployeeFormEdit(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput())

    class Meta:
        model = User
        fields = ("password",)

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/templates/employee/account.html

 <form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {% bootstrap_form employee_form %}
    <button type="submit" class="btn btn-pink">Update</button>
  </form>

https://gitlab.com/firdausmah/railercom/blob/master/railercomapp/models.py 它只是使用标准的用户模型

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

【问题讨论】:

    标签: python django forms view passwords


    【解决方案1】:
    class EmployeeFormEdit(forms.ModelForm):
        password = forms.CharField(widget=forms.PasswordInput())
    
        class Meta:
            model = User
            fields = ("password",)   
    
        def save(self, commit=True):
            user = super(EmployeeFormEdit, self).save(commit=False)
            user.set_password(self.cleaned_data["password"])
            if commit:
                user.save()
            return user
    

    您必须使用user.set_password()set your password

    【讨论】:

    • 谢谢。添加 def save 时出现此错误 - “super(type, obj): obj must be an instance or subtype of type”
    • 我让它这样工作,谢谢你的信息: if employee_form.is_valid(): employee = employee_form.save(commit=False) employee.set_password(employee_form.cleaned_data["password" ]) employee.save() 返回重定向(employee_home)
    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    相关资源
    最近更新 更多