Reputation: 93
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
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