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