Django: Как создать суперпользователя?
Добрый день,
Я пытаюсь создать пользовательскую модель пользователя с помощью AbstractBaseUser.
models.py
from django.db import models
from django.utils import timezone
from django.utils.translation import gettext as _
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
# Create your models here.
class CustomAccountManager(BaseUserManager):
def create_user(self, email, username, password, **other):
email = self.normalize_email(email)
user = self.model(
email=email,
username=username,
**other
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email,
password=password,
username=username,
)
user.is_admin = True
user.save(using=self._db)
return user
class NewUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(_('email adress'), unique=True)
username = models.CharField(max_length=100, unique=True)
start_date = models.DateTimeField(default=timezone.now)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = CustomAccountManager()
def __str__(self):
return self.email
Для его создания я использовал документацию. https://docs.djangoproject.com/en/4.0/topics/auth/customizing/
Я удалил свою базу данных, сделал makemigrations, migrate и создал суперпользователя, как на скриншоте:
С паролем 'admin' и электронной почтой 'admin@admin.com'. Но это не работает, как вы видите на скриншоте.
Вы знаете проблему?
Большое спасибо! :-)
Редактирование: settings.py
INSTALLED_APPS = [
'abstractuser',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
AUTH_USER_MODEL = 'abstractuser.NewUser'
Поле is_staff
определяет, может ли пользователь войти на сайт администратора. В вашем коде вы не устанавливаете это свойство в True
при создании суперпользователей.
Вам нужно либо установить user.is_staff = True
в вашей create_superuser
функции , либо заменить поле is_staff
свойством, которое читается из is_admin
.
def create_superuser(self, email, username, password):
user = self.create_user(
email,
password=password,
username=username,
)
user.is_admin = True
user.is_staff = True # can access the admin site
user.save(using=self._db)
return user
Решение 1:
class NewUser(AbstractBaseUser, PermissionsMixin):
.
.
.
@property
def is_admin(self):
if is_superuser and is_staff:
return True
return False
Решение 2:
def create_superuser(self, email, password, **other):
other.setdefault('is_staff', True)
other.setdefault('is_superuser', True)
if other.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if other.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self._create_user(email, password, **other)
Обязательно добавьте следующие методы в вашу пользовательскую модель пользователя. Это методы, необходимые панели django-admin. Источник - django
def has_perm(self, perm, obj=None):
"Does the user have a specific permission?"
# Simplest possible answer: Yes, always
return True
def has_module_perms(self, app_label):
"Does the user have permissions to view the app `app_label`?"
# Simplest possible answer: Yes, always
return True
@property
def is_staff(self):
"Is the user a member of staff?"
# Simplest possible answer: All admins are staff
return self.is_admin