Django rest-auth allauth registration with email, first and last name, and without username Django rest-auth allauth registration with email, first and last name, and without username django django

Django rest-auth allauth registration with email, first and last name, and without username


  1. Make sure you have ACCOUNT_USERNAME_REQUIRED = False in your settings.py file.

  2. For first_name and last_name you need to write a custom RegisterSerializer (https://github.com/Tivix/django-rest-auth/blob/master/rest_auth/registration/serializers.py#L166)

here's a sample code for serializers.py

from allauth.account import app_settings as allauth_settingsfrom allauth.utils import email_address_existsfrom allauth.account.adapter import get_adapterfrom allauth.account.utils import setup_user_emailclass RegisterSerializer(serializers.Serializer):    email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)    first_name = serializers.CharField(required=True, write_only=True)    last_name = serializers.CharField(required=True, write_only=True)    password1 = serializers.CharField(required=True, write_only=True)    password2 = serializers.CharField(required=True, write_only=True)    def validate_email(self, email):        email = get_adapter().clean_email(email)        if allauth_settings.UNIQUE_EMAIL:            if email and email_address_exists(email):                raise serializers.ValidationError(                    _("A user is already registered with this e-mail address."))        return email    def validate_password1(self, password):        return get_adapter().clean_password(password)    def validate(self, data):        if data['password1'] != data['password2']:            raise serializers.ValidationError(                _("The two password fields didn't match."))        return data    def get_cleaned_data(self):        return {            'first_name': self.validated_data.get('first_name', ''),            'last_name': self.validated_data.get('last_name', ''),            'password1': self.validated_data.get('password1', ''),            'email': self.validated_data.get('email', ''),        }    def save(self, request):        adapter = get_adapter()        user = adapter.new_user(request)        self.cleaned_data = self.get_cleaned_data()        adapter.save_user(request, user, self)        setup_user_email(request, user, [])        user.save()        return user
  1. In settings.py make sure you add to refer to new Serializer.

    REST_AUTH_REGISTER_SERIALIZERS = {        'REGISTER_SERIALIZER': 'path.to.RegisterSerializer',}


You can also just overwrite the custom_signup method on RegisterSerializer, which is intended for this purpose.

from rest_auth.registration.serializers import RegisterSerializerfrom rest_auth.registration.views import RegisterViewfrom rest_framework import serializersclass NameRegistrationSerializer(RegisterSerializer):  first_name = serializers.CharField(required=False)  last_name = serializers.CharField(required=False)  def custom_signup(self, request, user):    user.first_name = self.validated_data.get('first_name', '')    user.last_name = self.validated_data.get('last_name', '')    user.save(update_fields=['first_name', 'last_name'])class NameRegistrationView(RegisterView):  serializer_class = NameRegistrationSerializer

Then use the following in your urls.py

url(r'^rest-auth/registration/name-registration/$', NameRegistrationView.as_view(), name="rest_name_register")

or set REGISTER_SERIALIZER in settings.py

REST_AUTH_REGISTER_SERIALIZERS = {    'REGISTER_SERIALIZER': 'path.to.RegisterSerializer',}


A more elegant solution would be to inherit from RegisterSerializer and extend as needed.

class MyRegisterSerializer(RegisterSerializer):    first_name = serializers.CharField(required=True, write_only=True)    last_name = serializers.CharField(required=True, write_only=True)    def get_cleaned_data(self):        return {            'first_name': self.validated_data.get('first_name', ''),            'last_name': self.validated_data.get('last_name', ''),            'password1': self.validated_data.get('password1', ''),            'email': self.validated_data.get('email', ''),        }    def save(self, request):        adapter = get_adapter()        user = adapter.new_user(request)        self.cleaned_data = self.get_cleaned_data()        adapter.save_user(request, user, self)        setup_user_email(request, user, [])        user.save()        return user