Extended profile not being saved django-allauth

975 views
Skip to first unread message

voger

unread,
Mar 16, 2014, 5:34:49 PM3/16/14
to django...@googlegroups.com
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"




Fabio Caritas Barrionuevo da Luz

unread,
Mar 17, 2014, 12:25:36 PM3/17/14
to django...@googlegroups.com
Voyager, Have you tried putting related_name in the Foreign Key?
 
class UserProfile(models.Model):
     # This line is required. Links UserProfile to a User model instance.
     user = models.ForeignKey(User, unique=True, related_name='userprofile')

voger

unread,
Mar 17, 2014, 1:33:44 PM3/17/14
to django...@googlegroups.com
Hi, thanks for the reply. I didn't know about the related_name. I tried
it, did a syncdb witch didn't do anything but still the extra fields
don't save.

On 03/17/2014 06:25 PM, Fabio Caritas Barrionuevo da Luz wrote:
> Voyager, Have you tried putting related_name in the Foreign Key?
>
> class UserProfile(models.Model):
> # This line is required. Links UserProfile to a User model
> instance.
> user = models.ForeignKey(User, unique=True,
> *related_name='userprofile'*)
>
> --
> 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...@googlegroups.com
> <mailto:django-users...@googlegroups.com>.
> To post to this group, send email to django...@googlegroups.com
> <mailto:django...@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/f78b228e-e759-441d-8005-862e21143fdc%40googlegroups.com
> <https://groups.google.com/d/msgid/django-users/f78b228e-e759-441d-8005-862e21143fdc%40googlegroups.com?utm_medium=email&utm_source=footer>.
> For more options, visit https://groups.google.com/d/optout.

voger

unread,
Mar 17, 2014, 8:25:36 PM3/17/14
to django...@googlegroups.com
Hi, I tried this in the django shell after I changed the line to
user = models.OneToOneField(User, related_name='userprofile') but I get
this error.

>>> import userprofile.models
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='test1')
>>> print u
test1
>>> u.userprofile
Traceback (most recent call last):
File "<input>", line 1, in <module>
File
"/home/voger/ssite_venv/lib/python2.7/site-packages/django/db/models/fields/related.py",
line 206, in __get__
self.related.get_accessor_name()))
DoesNotExist: User has no userprofile.
Reply all
Reply to author
Forward
0 new messages