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.