[Answered ]-Django Extending User Model โ€“ Inherit Profile Form from Model

1๐Ÿ‘

โœ…

I generally use ModelForm instead of CreateUserForm for UserRegistration like this and add password1 and password2 fields in it. also, I check if they both are the same.:

forms.py

class UserRegistrationForm(forms.ModelForm):
    password = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Repeat Password', widget=forms.PasswordInput)
    email = forms.EmailField(label='Email')
    date_of_birth = forms.DateField(widget=forms.widgets.DateInput(attrs={'type': 'date'}))
    class Meta:
        model = User
        fields = ['username', 'first_name', 'last_name', 'email',
                 ] #these ordering will be as follow in html form

    def clean_password2(self):
        cd = self.cleaned_data
        if cd['password'] != cd['password2']:
            raise forms.ValidationError("Passwords don't match")
        return cd['password2']

Then in views, I create a user and their profile and save the password in encrypted form, and link their profile.

views.py

def register(request):
    u_form = UserRegistrationForm(data=request.POST or None)
    p_form = ProfileForm(data=request.POST or None, files=request.FILES or None)
    if u_form.is_valid() and p_form.is_valid():
        new_user = u_form.save(commit=False)
        new_user.set_password(u_form.cleaned_data['password']) #this saves password in encrypted form instead of raw password
        new_user.save()
        profile = p_form.save(commit=False)
        profile.user = new_user
        profile.save()
        return render(request, 'accounts/register_done.html', {'new_user': user})
    return render(request, 'accounts/register.html', {'user_form': u_form, 'profile_form':p_form})

You can modify it as you like.

Leave a comment