Django Custom User Model Optional Field and Integer Field with Specific Format

joween

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
MeL

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

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Omitting password field for custom django user model

Add a field to the Django admin for a custom user model

Django: Optional model form field

Create custom permission dynamically for specific field name of a model in Django

Custom id field in Django model

Django creating a custom model field

writing Django custom model field

Django saving in a model with User field

Django model field set default user in model

Django set range for integer model field as constraint

django integer model field with float form input

Optional field with strict format

HTML format on Django text field model

How to change the field of username to user_name in to django custom user model?

Django: reset a specific field of a model every hour

Django ModelForm dynamic field choices for a specific model

Django: clean only specific model field?

Django - Access specific field from a model to another

How to add a custom method to a model field in Django?

Django admin model field set to current user

Multiple USERNAME_FIELD in django user model

Django: Customize the User model's return field

Adding data to a Django model associated with a user field

django: valueerror on optional field

Access Django custom user profile field

Accessing a field on a Django model that is linked to a different model via the User model

how to get data of a specific user from a django model and store each field in a separate variable

Confused about how to make Django model field optional

Can I make the foreign key field optional in Django model