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"
--
You received this message because you are subscribed to the Google Groups "Django
users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/532618F9.1090107%40yahoo.gr.
For more options, visit https://groups.google.com/d/optout.