42π
-
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/iMerica/dj-rest-auth/blob/bf168d9830ca2e6fde56f83f46fe48ab0adc8877/dj_rest_auth/registration/serializers.py#L197)
hereβs a sample code for serializers.py
from allauth.account import app_settings as allauth_settings
from allauth.utils import email_address_exists
from allauth.account.adapter import get_adapter
from allauth.account.utils import setup_user_email
class RegisterSerializer(serializers.Serializer):
first_name = serializers.CharField(required=True, write_only=True)
last_name = serializers.CharField(required=True, write_only=True)
email = serializers.EmailField(required=allauth_settings.EMAIL_REQUIRED)
password1 = serializers.CharField(write_only=True)
password2 = serializers.CharField(write_only=True)
def validate_username(self, username):
username = get_adapter().clean_username(username)
return username
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 custom_signup(self, request, user):
pass
def get_cleaned_data(self):
return {
'first_name': self.validated_data.get('first_name', ''),
'last_name': self.validated_data.get('last_name', ''),
'username': self.validated_data.get('username', ''),
'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()
user = adapter.save_user(request, user, self, commit=False)
if "password1" in self.cleaned_data:
try:
adapter.clean_password(self.cleaned_data['password1'], user=user)
except DjangoValidationError as exc:
raise serializers.ValidationError(
detail=serializers.as_serializer_error(exc)
)
user.save()
self.custom_signup(request, user)
setup_user_email(request, user, [])
return user
-
In
settings.py
make sure you add to refer to new Serializer.REST_AUTH_REGISTER_SERIALIZERS = { 'REGISTER_SERIALIZER': 'path.to.RegisterSerializer', }
28π
You can also just overwrite the custom_signup
method on RegisterSerializer
, which is intended for this purpose.
from rest_auth.registration.serializers import RegisterSerializer
from rest_auth.registration.views import RegisterView
from rest_framework import serializers
class 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',
}
- [Django]-Use variable as dictionary key in Django template
- [Django]-Django App Improperly Configured β The app module has multiple filesystem locations
- [Django]-Calling Django `reverse` in client-side Javascript
16π
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
- [Django]-Django connection to PostgreSQL: "Peer authentication failed"
- [Django]-Differences between STATICFILES_DIR, STATIC_ROOT and MEDIA_ROOT
- [Django]-Django: Validate file type of uploaded file
0π
For anyone who needs a quick solution
from dj_rest_auth.registration.serializers import RegisterSerializer
from rest_framework import serializers
class CustomRegistration(RegisterSerializer):
first_name = serializers.CharField(write_only=True)
last_name = serializers.CharField(write_only=True)
def custom_signup(self, request, user):
first = request.POST.get("first_name")
last = request.POST.get("last_name")
user.first_name = first
user.last_name = last
user.save()
`
Be Sure to include path to custom registration in settings:
REST_AUTH_REGISTER_SERIALIZERS = {
'REGISTER_SERIALIZER': 'path_to.CustomRegistration',
}
- [Django]-How to show a many-to-many field with "list_display" in Django Admin?
- [Django]-Django: Reference to an outer query may only be used in a subquery
- [Django]-How to update an object from edit form in Django?