dashkandhar
dashkandhar

Reputation: 93

What should i do either extend django base user model or create custom user model?

I am starting a social network kind of website as a hobby project and have knowledge of working with Django but due to less experience I am confused about my user model

my user will have multiple fields and I want to give different permissions.

P.S I am really sorry for being so vague

Upvotes: 1

Views: 581

Answers (1)

aasmpro
aasmpro

Reputation: 604

As Django recommends

If you’re starting a new project, it’s highly recommended to set up a custom user model, even if the default User model is sufficient for you.

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

in my experience, it's better to override it too, but i do it by overriding from AbstractBaseUser with a custome manager, so i do what ever i want!

Manager

from django.contrib.auth.base_user import BaseUserManager


class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, username, password, **extra_fields):
        if not username:
            raise ValueError('The given username must be set')
        username = self.model.normalize_username(username)
        user = self.model(username=username, **extra_fields)
        if password is None:
            password = self.make_random_password()
        user.set_password(password)
        user.save()
        return user

    def create_user(self, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(username=username, password=password, **extra_fields)

    def create_staff(self, username, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(username=username, password=password, **extra_fields)

    def create_superuser(self, username, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(username=username, password=password, **extra_fields)

User model

from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.validators import ASCIIUsernameValidator
from django.core.mail import send_mail
from django.db import models

from accounts.managers import UserManager


class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=150, unique=True,
                                help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.',
                                validators=[ascii_username_validator],
                                error_messages={'unique': "A user with that username already exists."})
    first_name = models.CharField(max_length=30, null=True, blank=True)
    last_name = models.CharField(max_length=150, null=True, blank=True)
    is_staff = models.BooleanField('staff status', default=False)
    is_active = models.BooleanField('active', default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = []

    def get_full_name(self):
        return '{} {}'.format(self.first_name, self.last_name).strip()

    def email_user(self, subject, message, from_email=None, **kwargs):
        send_mail(subject, message, from_email, [self.email], **kwargs)

    def __str__(self):
        return str(self.username)

and then in your settings you should set AUTH_USER_MODEL:

AUTH_USER_MODEL = 'accounts.User'

also, check these links:

Upvotes: 2

Related Questions