mardi 27 mai 2014

inscription personnalisée avec django-allauth - Stack Overflow


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 %}



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


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 %}


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

0 commentaires:

Enregistrer un commentaire