0

I'm trying to ask a user some additional info while signing up. I'm using django allauth for authorization and authentication. I try to add three more fields during the signup process. If If I run it, it shows me the standard form plus gender field. However, it doesn't seem to really work. How can I save the data? Could someone help? Thank you in advance!

EDITED: if I just use

if form.is_valid():
    form.save()
    return redirect('/success/')

I get an error:

save() missing 1 required positional argument: 'user'

I'm quite new to django.

I created signups app in the project.

I put this in allauth_settings.py:

ACCOUNT_SIGNUP_FORM_CLASS = 'signups.forms.MySignupForm'

My signups/model.py:

from django.contrib.auth.models import User
from django.db import models
from allauth.account.models import EmailAddress
from allauth.socialaccount.models import SocialAccount
import hashlib


class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    about_me = models.TextField(null=True, blank=True)
    timestamp = models.DateTimeField(auto_now_add= True, auto_now=False)
    updated = models.DateTimeField(auto_now_add= False, auto_now=True)

    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')

    def __unicode__(self):
        return self.user.username

    class Meta:
        db_table = 'user_profile'

    def profile_image_url(self):
        """
        Return the URL for the user's Facebook icon if the user is logged in via
        Facebook, otherwise return the user's Gravatar URL
        """
        fb_uid = SocialAccount.objects.filter(user_id=self.user.id, provider='facebook')

        if len(fb_uid):
            return "http://graph.facebook.com/{}/picture?width=40&height=40".format(fb_uid[0].uid)

        return "http://www.gravatar.com/avatar/{}?s=40".format(hashlib.md5(self.user.email).hexdigest())

def account_verified(self):
    """
    If the user is logged in and has verified hisser email address, return True,
    otherwise return False
    """
    if self.user.is_authenticated:
        result = EmailAddress.objects.filter(email=self.user.email)

        if len(result):
            return result[0].verified

    return False


User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

my signups/forms.py:

from allauth.account.forms import SignupForm
from django import forms
from .models import UserProfile


class MySignupForm(SignupForm):
    class Meta:
        model = UserProfile

    gender = forms.CharField(max_length=1, label='gender')

    def save(self, user):
        user.gender = self.cleaned_data['gender']
        user.save()

my signups/views.py:

from django.template import RequestContext
from django.shortcuts import render_to_response
from .forms import SignupForm


def index(request):
    form = MySignupForm(request.POST or None)

    if form.is_valid:
        ???

    return render_to_response("signups/index.html", locals(),
                              context_instance=RequestContext(request))

My index.html is very basic, I just wanted to see the representation of the form:

{% extends 'account/base.html' %}

{% block head_title %}ProjectName{% endblock %}

{% block content %}
    <form method="POST" action="">
        {{ form.as_p }}
        <input type="submit">
    </form>
{% endblock %}
doru
  • 9,022
  • 2
  • 33
  • 43
user3310881
  • 19
  • 1
  • 7
  • 1
    possible duplicate of [How to customize user profile when using django-allauth](http://stackoverflow.com/questions/12303478/how-to-customize-user-profile-when-using-django-allauth) – Steinar Lima Apr 04 '14 at 03:25

1 Answers1

0

You are instantiating the SignupForm, which is the standard form but not your MySignupForm in the view. Change it like this:

def index(request):
    form = MySignupForm()
    return render_to_response("signups/index.html", locals(),
                      context_instance=RequestContext(request))
Santosh Ghimire
  • 3,087
  • 8
  • 35
  • 63
  • Hi Santosh, thank you! I managed to find this as well. I edited he code above. However, even if I see the fields now(with Gender), I cannot save the data. If I just use if form.is_valid(): form.save() return redirect('/success/') I get an error: save() missing 1 required positional argument: 'user' – user3310881 Apr 03 '14 at 12:41