0

I'm new in Django rest_framework. I'm using a custom user model and djoser as my authentication system. I want to use my custom user model in the djoser register view and I don't know how to identify that in the rest_framework settings?

settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
    ),
    'DEFAULT_PERMISSIONS_CLASSES':(
        'rest_framework.permissions.IsAuthenticated',
    ),
}

models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, phone, password=None):
        if not email:
            raise ValueError("Users must have an email address")
        if not username:
            raise ValueError("Users must have an username")
        if not phone:
            raise ValueError("Users must have a phone number")

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            phone=phone
            )
        user.set_password(password)
        user.save(using=self._db)
        return user
    
    def create_superuser(self,email, username, phone, password):
        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            phone=phone,
            password=password
            )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True

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


class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name="email",max_length=60, unique=True)
    username = models.CharField(max_length=60,unique=True)
    phone = models.CharField(max_length=60,unique=True)
    date_joined = models.DateTimeField(verbose_name="date joined",auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="last login",auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    first_name = models.CharField(max_length=60,null=True)
    last_name = models.CharField(max_length=60,null=True)
    wilaya = models.CharField(max_length=60,null=True)
    city = models.CharField(max_length=60,null=True)
    address = models.CharField(max_length=200,null=True)
    store_coordinates = models.CharField(max_length=60,null=True)
    documents1 = models.CharField(max_length=60,null=True)
    documents2 = models.CharField(max_length=60,null=True)


    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email','phone']
    

    objects = MyAccountManager()

    def __str__(self):
        return self.username
        
    def has_perm(self, perm, obj=None):
        return self.is_admin
    def has_module_perms(self, app_label):
        return True

What should I add to use my custom user model in djoser register view?

Usama Abdulrehman
  • 1,041
  • 3
  • 11
  • 21
YahyaST18
  • 101
  • 1
  • 10

1 Answers1

0

You're doing almost everything right, but you need to tell Django in the settings what user model it should use.

In models.py use something like this

from django.contrib.auth.models import AbstractUser
from .managers import UserManager

class User(AbstractUser):
    # Add whatever fields you want

    # Use your custom manager
    objects = UserManager()

In settings.py

# Tell Django what user model should be used
AUTH_USER_MODEL = 'auth.User'  # app_label.model

make sure you use python manage.py makemigrations && python manage.py migrate to create your custom user model.

Enjoy!

loicgasser
  • 1,403
  • 12
  • 17