I am trying to extend the user profile according to this page
https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#extending-the-existing-user-model
I am using django-allauth for registration. My problem is that when the
user registers I can't find any new rows in the database. The table is
empty. Moreover if I do like the documentation says
u = User.objects.get(username='test1')
>>> print u
test1
>> users_data = u.userprofile.gender
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'userprofile'
Can someone please help me? I trying for a long time to solve this and
Google confuses me even more.
My model.py is:
from django.contrib.auth.models import User
from django.db import models
from cities_light.models import Country
class UserProfile(models.Model):
# This line is required. Links UserProfile to a User model instance.
user = models.ForeignKey(User, unique=True)
#define a touple with available gender choices
GENDER_CHOICES = (
('m', 'Male'),
('f', 'Female'),
)
# gender can take only one of the GENDER_CHOICES options
gender = models.CharField(max_length=1, choices=GENDER_CHOICES,
verbose_name='Gender')
birth_date = models.DateField(verbose_name='Birth Date')
country = models.ForeignKey(Country, verbose_name='Country',
max_length=50, default="")
post_code = models.CharField(verbose_name="Postal Code",
max_length=5, default="")
has_accepted_tos = models.BooleanField(default=False,
verbose_name='I accept site roules')
is_18_or_older = models.BooleanField(default=False, verbose_name='I
am at least 18 years old')
area_of_residence = models.CharField(verbose_name='Area',
max_length=50, default='')
# Override the __unicode__() method to return something meaningful!
def __unicode__(self):
return self.user.username
User.profile = property(lambda u:
UserProfile.objects.get_or_create(user=u)[0])
My forms.py is:
from datetime import date
from django.contrib.auth import get_user_model
from django.forms import CharField, BooleanField, Form, ChoiceField,
DateField
from django.forms.extras import SelectDateWidget
from django.forms import ModelChoiceField
from django.utils.translation import ugettext as _
from cities_light.models import Country
import utils
yearNow = date.today().year
GENDER_CHOICES = (
('m', _('Male')),
('f', _('Female')),
)
class SignupForm(Form):
has_accepted_tos = BooleanField(
error_messages={'required': _('You must accept the terms and
conditions')},
label=_('I accept site terms and conditions'),
required=True)
is_18_or_older = BooleanField(
error_messages={'required': _('You must be at least 18 years
old to use this site')},
label=_('I am at least 18 years old'),
required=True)
gender = ChoiceField(GENDER_CHOICES, label=_('Gender'), required=True)
country =
ModelChoiceField(queryset=Country.objects.all().order_by('name'),
label=_('Country'),
required=True, empty_label=None, initial=89)
post_code = CharField(max_length=5, min_length=5, label=_('Postal
Code'), required=False)
birth_date = DateField(widget=SelectDateWidget(years=range(yearNow
- 18, yearNow - 100, -1)), required=True,
initial="", label=_('Birth Date'))
area_of_residence = CharField(required=False, max_length=50,
label=_('Area'))
class Meta:
model = get_user_model()
# model = UserProfile
def save(self, user):
print user
user.has_accepted_tos = self.cleaned_data['has_accepted_tos']
user.is_18_or_older = self.cleaned_data['is_18_or_older']
user.gender = self.cleaned_data['gender']
user.country = self.cleaned_data['country']
user.post_code = self.cleaned_data['post_code']
user.birth_date = self.cleaned_data['birth_date']
user.area_of_residence = self.cleaned_data['area_of_residence']
user.save(force_update=True)
def clean(self):
cleaned_data = super(SignupForm, self).clean()
country = cleaned_data.get('country')
post_code = cleaned_data.get('post_code')
area = cleaned_data.get('area_of_residence')
error_msg = _(u"Location not found")
if utils.verify_signup_location(country=country.code2,
area=area, post_code=post_code) is False:
self._errors["post_code"] = self.error_class([error_msg])
self._errors["area_of_residence"] =
self.error_class([error_msg])
del cleaned_data["post_code"]
del cleaned_data["area_of_residence"]
return cleaned_data
and in my settings.py I have
AUTHENTICATION_BACKENDS = DEFAULT_SETTINGS.AUTHENTICATION_BACKENDS + (
"guardian.backends.ObjectPermissionBackend",
# Needed to login by username in Django admin, regardless of `allauth`
"django.contrib.auth.backends.ModelBackend",
# `allauth` specific authentication methods, such as login by e-mail
"allauth.account.auth_backends.AuthenticationBackend",
)
AUTH_PROFILE_MODULE = 'userprofile.UserProfile'
ACCOUNT_SIGNUP_FORM_CLASS = "userprofile.forms.SignupForm"