Django rest-auth allauth registration with email, first and last name, and without username
Make sure you have
ACCOUNT_USERNAME_REQUIRED = False
in yoursettings.py
file.For
first_name
andlast_name
you need to write a customRegisterSerializer
(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
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