Search code examples
pythondjangodjango-formsdjango-registration

How to extend field in UserCreationForm in django?


I have been trying to add a phone number field in UserCreationForm so that on registration a user gives its phone number but unfortunately phone number is not storing. it accepts the Phone number on the registration page but it doesn't show the phone number on the webpage. I think it is not storing.

forms.py

class myCreateForm(UserCreationForm):
ph= forms.CharField(max_length=400, required=True, label='Phone')
class Meta:
    model = User
    fields = ['first_name', 'last_name' ,'username', 'email', 'password1', 'password2','ph']

def save(self, commit=True):
    user = super(myCreateForm, self).save(commit=False)
    user.ph = self.cleaned_data["ph"]
    if commit:
        user.save()
    return user

views.py

def register(request):
form = myCreateForm()
if request.method == "POST":
    form = myCreateForm(request.POST)
    if form.is_valid():
        form.save()
        return redirect('loginPage')
return render(request , 'register.html', {'form' : form})

template

{%for i in user%}
Hi {{i.first_name}}<br>
Username : {{i.username}}<br>
E-Mail : {{i.email}}<br>
Phone : {{i.ph}}<br>
{%endfor%}

but on my webpage, it shows everything except phone number.

Please Help Me Out


Solution

  • You need to extend the Django User model.See the Docs.

    For example let's create a new model Profile which will have OneToOne relation with django user model

    class Profile(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        phone = models.CharField(max_length=50..)
    

    Now in your view

    form = myCreateForm(request.POST)
        if form.is_valid():
            user = form.save()
            phone = form.cleaned_data.get('ph')
            Profile.objects.create(user=user,phone=ph)
            return redirect...
    

    Now in the template {{i.profile.phone}} will give the result for phone field.