user8302785
user8302785

Reputation:

How to add extra fields to registration end point of rest-auth

I am using rest-auth registration api for user registration. I have some extra fields in the UserProfile model.

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save


class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    org_id = models.CharField(max_length=100, default='')
    is_teacher = models.BooleanField(blank=True, default=False)

    def __str__(self):
        return self.user.username


    def create_profile(sender, **kwargs):
        if kwargs['created']:
            user_profile = UserProfile.objects.create(user=kwargs['instance'])


    post_save.connect(create_profile, sender=User)

The UserProfile model is shown above. How can I add these fields to rest-auth regestration api endpoint and save the data to database.

Upvotes: 3

Views: 682

Answers (2)

Diego
Diego

Reputation: 123

There is no need to change the RegisterView and the url pattern. Just add in settings.py:

REST_AUTH = {
    'REGISTER_SERIALIZER': 'my-app.serializers.RegistrationSerializer',
}

Upvotes: 0

user8302785
user8302785

Reputation:

I found an answer for myself

The serializers can be written as

from rest_framework import serializers
from rest_auth.registration.serializers import RegisterSerializer
from .models import UserProfile



class RegistrationSerializer(RegisterSerializer):

    first_name = serializers.CharField(required=False)
    last_name = serializers.CharField(required=False)
    personal_id = serializers.CharField(required=True)

    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.userprofile.personal_id = self.validated_data.get(
            'personal_id', '')

        user.save(update_fields=['first_name', 'last_name'])
        user.userprofile.save(update_fields=['org_id'])

I didnt add the is_teacher because its optional.

In views.py extend the RegisterView of the rest_auth.regeistration.views to pass this data and its done.

class RegistrationView(RegisterView):
    serializer_class = RegistrationSerializer

And finally add a url and pass RegisterView.as_view().

Upvotes: 2

Related Questions