Django formtools user registrations password

44 Views Asked by At

Trying to create user using django-formtools.

forms.py

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm):
        model = User
        fields = ('username', 'password1', 'password2')

class CustomProfileCreateForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('name', 'email')

views.py

class SignupWizard(SessionWizardView):
    template_name = "user/registration.html"
    form_list = [CustomUserCreationForm, CustomProfileCreateForm]
    instance = None

    def get_form_instance(self, step):
        if self.instance is None:
            self.instance = User()
        return self.instance

    def done(self, form_list, **kwargs):
        self.instance.save()
        return render(self.request, 'done.html', {
            'form_data': [form.cleaned_data for form in form_list],
        })

All are ok except password. Password is not set. How to save form correctly

2

There are 2 best solutions below

2
Nicolas Appriou On

Password for users are set with the set_password method of the user models.

The password1 and password2 fields are not fields of the User model, but fields of the UserCreationForm. You should call the save method of your CustomUserCreationForm instead of the save method of your user.

To understand better how all this work, I suggest you take a look at the UserCreationForm.save method.

0
Russell On

Solved my problem initially:

class RegistrationWizardView(SessionWizardView):
    file_storage = DefaultStorage()
    template_name = "patient/registration.html"
    form_list = [CustomUserCreationForm, CustomProfileCreateForm]
    instance = None

    def get_form_instance(self, step):
        if self.instance is None:
            self.instance = User()
        return self.instance

    def done(self, form_list, **kwargs):
        data = {}
        for form in form_list:
            data.update(**form.cleaned_data)
        if data.get('password1', None):
            data.update({'password': data['password1']})
            data.pop('password1')
            data.pop('password2')
        User.objects.create_user(**data)
        return redirect(reverse_lazy('account_login'))