How can I customize Rest Auth Registration view

Viewed 105

I'm working on small project using Django / Rest Framework with rest_auth. and i would like to customize the registration view by asking for other fields like first_name and last_name also i would like to call some function after the registration. how can i customize the rest_auth registration

1 Answers

you can customize your User Model & of course your auth system easily in Django, we assume you are using Token-based auth.

First, you can create your own User model like this link or semicode below:

models.py

class MyUserManager(BaseUserManager):
    def create_user(self, username, is_male, password=None):
        if not username:
            raise ValueError('Users must have a username')
    user = self.model(
        username=username,
        is_male=is_male,
    )

    user.set_password(password)
    user.save(using=self._db)
    return user

def create_superuser(self, username, password=None, is_male=True):
    user = self.create_user(
        username,
        password=password,
        is_male=is_male
    )
    user.is_admin = True
    user.save(using=self._db)
    return user


class MyUser(AbstractBaseUser):
    username            = models.CharField(max_length=127, unique=True)
    password            = models.CharField(max_length=127)
    first_name          = models.CharField(max_length=65, blank=True, null=True)
    last_name           = models.CharField(max_length=127, blank=True, null=True)
    is_admin            = models.BooleanField(default=False)
    is_active           = models.BooleanField(default=True)
    date_joined         = models.DateTimeField(auto_now_add=True)
    last_login          = models.DateTimeField(blank=True, null=True)
    is_male             = models.BooleanField(default=True)
    profile_picture     = models.ImageField(upload_to='profile_pictures/', max_length=255, blank=True, null=True)
    email               = models.EmailField(verbose_name='email address', max_length=255, blank=True, null=True)

    birth_date          = models.DateField(blank=True, null=True)
    objects = MyUserManager()

    USERNAME_FIELD = 'username'

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

    class Meta:
        db_table = 'User'

Then you can create your own Token model & authentication file like this like or semicode below:

models.py

@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

class Token(Token):
    key = models.CharField(_("Key"), max_length=40, primary_key=True)
    user = models.ForeignKey(User, related_name='auth_tokens', on_delete=models.CASCADE, verbose_name=_("User"))
    created = models.DateTimeField(_("Created"), auto_now_add=True)

authentication.py:

from rest_framework.authentication import TokenAuthentication

from .models import Token


class TokenAuthentication(TokenAuthentication):
    model = Token

At the end you have to add this lines to your settings.py:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'your_project.authentication.TokenAuthentication',
    ],
}

+ ... +

AUTH_USER_MODEL = 'user.User'

+ ...

Then you can write your custom login in your views, like something like this:

views.py

class LoginAPIView(APIView):
    permission_classes = [AllowAny]

    def post(self, request):
        phone_number = request.data.get('phone_number')
        try:
            user = User.objects.get(phone_number=phone_number)
        except User.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        token, created = Token.objects.get_or_create(user=user)
        serializer = UserProfileSerializer(user)
        data = {'token': token.key}
        data.update(serializer.data)
        return Response(data=data, status=status.HTTP_202_ACCEPTED)

Hope this answer will be helpful, Good luck.

Related