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.

Reply via email to