Search code examples
pythondjangodjango-allauth

Allauth will not save additional fields


I have been trying to extend my allauth signup form but cannot seem to get it working, I receive no error messages and everything appears to work fine except all my additional fields do not get saved. Please tell me if you can see what I am doing wrong, thanks!

Models -

from django.db import models
from django.contrib.auth.models import User

class EmployerProfile(models.Model):

    region_choice = (
        ('1', 'Auckland'),
        ('2', 'Wellington'),
        ('3', 'Christchurch')
    )
    suburb_choice = (
        ('1', 'Glendowie'),
        ('2', 'Kohimarama'),
        ('3', 'Mission Bay')
    )
    industry_choice = (
        ('1', 'Restaurant'),
        ('2', 'IT'),
        ('3', 'Construction')
    )

    user = models.OneToOneField(User, unique=True)
    home_number = models.IntegerField(max_length=12)
    mobile_number = models.IntegerField(max_length=12)
    business_name = models.CharField(max_length=50)
    business_address_number = models.IntegerField()
    business_address_street = models.CharField(max_length=50)
    business_address_region = models.CharField(max_length=50, choices=region_choice)
    business_address_suburb = models.CharField(max_length=50, choices=suburb_choice)
    business_address_postcode = models.IntegerField(max_length=4)
    business_industry = models.CharField(max_length=50, choices=industry_choice)

    class Meta:
        verbose_name = 'Employer Profile'

Forms -

from django import forms
from models import EmployerProfile

class SignupForm(forms.Form):

    first_name = forms.CharField(max_length=30, label='First Name')
    last_name = forms.CharField(max_length=30, label='Last Name')
    home_number = forms.IntegerField(label='Home Number')
    mobile_number = forms.IntegerField(label='Mobile Number')
    business_name = forms.CharField(label='Business Name')
    business_address_number = forms.IntegerField(label='Street Number')
    business_address_street = forms.CharField(label='Street Name')
    business_address_region = forms.ChoiceField(choices=EmployerProfile.region_choice, label='Region')
    business_address_suburb = forms.ChoiceField(choices=EmployerProfile.suburb_choice, label='Suburb')
    business_address_postcode = forms.IntegerField(label='Postcode')
    business_industry = forms.ChoiceField(choices=EmployerProfile.industry_choice, label='Industry')

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.home_number = self.cleaned_data['home_number']
        user.mobile_number = self.cleaned_data['mobile_number']
        user.business_name = self.cleaned_data['business_name']
        user.business_address_number = self.cleaned_data['business_address_number']
        user.business_address_street = self.cleaned_data['business_address_street']
        user.business_address_region = self.cleaned_data['business_address_region']
        user.business_address_suburb = self.cleaned_data['business_address_suburb']
        user.business_address_postcode = self.cleaned_data['business_address_postcode']
        user.business_industry = self.cleaned_data['business_industry']

        user.save()

    class Meta:
        model = EmployerProfile

Settings -

SITE_ID = 1
ACCOUNT_SIGNUP_FORM_CLASS = 'profiles.forms.SignupForm'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = None
LOGIN_REDIRECT_URL = '/'

Solution

  • You are adding new attributes on the user object instead of creating a new EmployerProfile. I believe the following code is what you are trying to achieve:

    class SignupForm(forms.Form):
        # ...
        def signup(self, request, user):
            EmployerProfile.objects.create(
                user=user,
                home_number=self.cleaned_data['home_number'],
                mobile_number=self.cleaned_data['mobile_number'],
                business_name=self.cleaned_data['business_name'],
                business_address_number=self.cleaned_data['business_address_number'],
                business_address_street=self.cleaned_data['business_address_street'],
                business_address_region=self.cleaned_data['business_address_region'],
                business_address_suburb=self.cleaned_data['business_address_suburb'],
                business_address_postcode=self.cleaned_data['business_address_postcode'],
                business_industry=self.cleaned_data['business_industry']
            )