1

fellow devs!

I am writing a custom user model in Django but I can't figure out how can I make a user input middle name for those who have it or won't force it for those who don't. This code works but I have to type a space to bypass the middle name field, which isn't the ideal behavior I want. Also, I want to know if it's possible to set a custom primary key to the field id_number.

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

class UserManager(BaseUserManager):
    def create_user(self, email, username, firstname, lastname, middlename, id_number, password=None, active=True, staff=False, admin=False):
        if not email:
            raise ValueError('User must have a valid Email Address!')
        if not username:
            raise ValueError('User must have Username!')
        if not password:
            raise ValueError('User must set Password!')
        if not firstname:
            raise ValueError('User must have First Name!')
        if not lastname:
            raise ValueError('User must have Last Name!')
        if not id_number:
            raise ValueError('User must have a valid ID number!')

        user = self.model(
            email=self.normalize_email(email),
            username=username.lower(),
            firstname=firstname.capitalize(),
            lastname=lastname.capitalize(),
            middlename=middlename.capitalize(),
            id_number=id_number
        )

        user.set_password(password)
        user.staff = staff
        user.admin = admin
        user.active = active
        user.save(using=self.db)
        return user

    def create_staffuser(self, email, username, firstname, lastname, middlename, id_number, password=None):
        user = self.create_user(
            email,
            username=username,
            lastname=lastname,
            firstname=firstname,
            middlename=middlename,
            id_number=id_number,
            password=password,
            staff=True
        )
        return user

    def create_superuser(self, email, username, firstname, lastname, middlename, id_number, password=None):
        user = self.create_user(
            email,
            username=username,
            lastname=lastname,
            firstname=firstname,
            middlename=middlename,
            id_number=id_number,
            password=password,
            admin=True,
            staff=True
        )
        return user

class User(AbstractBaseUser):
    email           = models.EmailField(verbose_name="email", max_length=128, unique=True)
    username        = models.CharField(max_length=128, unique=True)
    firstname       = models.CharField(max_length=128)
    lastname        = models.CharField(max_length=128)
    middlename      = models.CharField(max_length=128)
    id_number       = models.IntegerField(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)
    admin           = models.BooleanField(default=False)
    active          = models.BooleanField(default=True)
    staff           = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email','firstname','lastname','middlename','id_number']

    objects = UserManager()

    def __str__(self):
        return self.email

    def get_fullname(self):
        if (self.middlename=="" or str.isspace(self.middlename) == True):
            return self.lastname + ", " + self.firstname + "."
        else:
            return self.lastname + ", " + self.firstname + " " + self.middlename + "."

    def get_id_number(self):
        return self.id_number

    def get_short_name(self):
        return self.username

    def has_perm(self, perm, obj=None):
        "Does the user have specific permission?"
        return True

    def has_module_perms(self, app_label):
        "Does the user have permission to view the app `app_label`?"
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        return self.staff

    @property
    def is_admin(self):
        "Is the user an admin member?"
        return self.admin

    @property
    def is_active(self):
        "Is the user active?"
        return self.active
Akshat Zala
  • 710
  • 1
  • 8
  • 23

1 Answers1

0

Just change your middlename field in your model as follows:

middlename = models.CharField(max_length=128, blank=true)

For more information, you can refer to this very useful SO answer: https://stackoverflow.com/a/8609425/13290801

MeL
  • 1,269
  • 3
  • 12
  • 30
  • thanks for the feedback, regarding for the middle name, I have managed to fix the issue by doing from this: `def create_user(self, email, username, firstname, lastname, middlename, id_number, password=None, active=True, staff=False, admin=False):` –  Aug 15 '20 at 06:34
  • to this: `def create_user(self, email, username, firstname, lastname, id_number, middlename=None, password=None, active=True, staff=False, admin=False):` –  Aug 15 '20 at 06:34