Django-fr

Forum

  • Accueil
  • » Django-fr
  • » django-rest-auth override SOCIALACCOUNT_FORMS uniquement username

#1 05-12-2015 15:22:29

sylflo
Membre
Inscription : 04-05-2015
Messages : 7

django-rest-auth override SOCIALACCOUNT_FORMS uniquement username

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

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


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 = "[url]http://127.0.0.1:8080[/url]"
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

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

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 = "[url]http://127.0.0.1:8080[/url]"
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.

Hors ligne

  • Accueil
  • » Django-fr
  • » django-rest-auth override SOCIALACCOUNT_FORMS uniquement username

Pied de page des forums