Bonjour,

J'utilise django-allauth avec django-rest-auth. Je peux enregister un utilisateur sur le site
ou utiliser l'enregistrement avec les réseaux sociaux. Néanmoins je voudrais lorsqu'un utilisateur s'enregistre
par le biais d'un réseau social que la personne puisse choisir son username. Or je bloque sur cette partie,
voci ce que j'ai effectué jusqu'à présent.

Voici la version de mes différents package

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
DRF: 3.2.4
django-rest-auth: 0.5.0
django-allauth: 0.23.0
Django: 1.8.4
PostgreSQL: 9.4.5
Python: 2.7.10
os: ArchLinux -x64
Voici les variables de django-allauth que j'utilise dans mon settings.py


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
ACCOUNT_SIGNUP_FORM_CLASS = 'API.forms.SignupForm'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = "http://127.0.0.1:8080"
ACCOUNT_EMAIL_SUBJECT_PREFIX = "[Locsapp]"
 
SOCIALACCOUNT_ADAPTER = 'API.adapter.DefaultSocialAccountAdapter'
SOCIALACCOUNT_AUTO_SIGNUP = False
SOCIALACCOUNT_FORMS = {'signup': 'API.forms.SocialNetworkSignupForm'}
SOCIALACCOUNT_EMAIL_VERIFICATION = "mandatory"
SOCIALACCOUNT_EMAIL_REQUIRED = True
SOCIALACCOUNT_QUERY_EMAIL = True
Ici j'override le formulaire d'enregistrement des réseaux sociaux pour que l'utilisateur puisse choisir un username quand il s'enregistre par le biais d'un réseau social.

Dans mon API/forms.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
from django import forms
from django.contrib.postgres.fields import ArrayField
from allauth.account.utils import (user_username, user_email,
                                   user_field)
from .adapter import get_adapter
from django.utils.translation import ugettext_lazy as _
from django.conf import settings
 
 
class SignupForm(forms.Form):
    email = ArrayField(forms.CharField(max_length=30, label='Voornaam'))
 
    def signup(self, request, user):
        user.email = (self.cleaned_data['email'])
        user.save()
 
 
class SocialNetworkSignupForm(forms.Form):
 
    def __init__(self, *args, **kwargs):
        self.sociallogin = kwargs.pop('sociallogin')
        user = self.sociallogin.user
        # TODO: Should become more generic, not listing
        # a few fixed properties.
        initial = {'email': 'email_toto',
                   'username': 'username_toto',
                   'first_name': 'first_name_toto',
                   'last_name': user_field(user, 'last_name') or ''}
        kwargs.update({
            'initial': initial,
            'email_required': kwargs.get('email_required',
                                         settings.EMAIL_REQUIRED)})
 
    def save(self, request):
        raise forms.ValidationError("This field throws an error")
        adapter = get_adapter()
        user = adapter.save_user(request, self.sociallogin, form=self)
        self.custom_signup(request, user)
        return user
 
    def raise_duplicate_email_error(self):
        raise forms.ValidationError(
            _("An account already exists with this e-mail address."
              " Please sign in to that account first, then connect"
              " your %s account.")
            % self.sociallogin.account.get_provider().name)
 
    def custom_signup(self, request, user):
        password = self.cleaned_data['password1']
        user.set_password(password)
        user.save()
J'ai mis des chaînes de caractères en dur dans les champs dans la variable initial mais quand l'utilisateur s'enregiste le champ username est vide et les autres champs
ne sont pas harcodés, ils sont remplacés par ceux du profile Facebook de l'utilisateur.


Si je mets cette configurations dans le fichier settings.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
ACCOUNT_SIGNUP_FORM_CLASS = 'API.forms.SignupForm'
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_EMAIL_VERIFICATION = "mandatory"
ACCOUNT_CONFIRM_EMAIL_ON_GET = True
ACCOUNT_EMAIL_CONFIRMATION_ANONYMOUS_REDIRECT_URL = "http://127.0.0.1:8080"
ACCOUNT_EMAIL_SUBJECT_PREFIX = "[Locsapp]"
 
SOCIALACCOUNT_ADAPTER = 'API.adapter.DefaultSocialAccountAdapter'
SOCIALACCOUNT_AUTO_SIGNUP = True
SOCIALACCOUNT_EMAIL_VERIFICATION = "mandatory"
SOCIALACCOUNT_EMAIL_REQUIRED = True
SOCIALACCOUNT_QUERY_EMAIL = True
Le champ username est rempli mais l'utilisateur ne peut pas choisir celui qu'il veut.