Search code examples
pythondjangoformsviewpasswords

django - cannot save password correctly in form


I am trying to have a form that allows the user to change password.

Everytime I change the password, it cannot login. for example if password is "jake", I change to "jake1", I cant login with the password "jake1" or even "jake"

Here is how the form looks like: https://i.sstatic.net/W4fff.jpg

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 Its just using the standard User model

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

Solution

  • 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
    

    you must use user.set_password() to set your password.