Джанго не может создать суперпользователя
Я хочу написать блог с Django. Модель пользователя по умолчанию не подходит для моего блога, я хочу написать своего собственного пользователя.
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class MyUserManager(BaseUserManager):
def create_superuser(self, email, username, password, created_at):
user = self.create_user(email=email,
username=username,
password = password,
created_at = created_at
)
user.is_admin = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name = 'email address',
max_length = 255,
unique = True,
)
username = models.CharField(
max_length = 100,
unique = True,
db_index = True,
)
created_at = models.DateField()
is_active = models.BooleanField(default = True)
is_admin = models.BooleanField(default = False)
objects = MyUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
def get_full_name(self):
return self.email
def get_short_name(self):
return self.username
def __unicode__(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.is_admin
Это ошибка.
Я следую инструкциям учебника. Я не знаю, почему возникает эта проблема.
Я публикую модель MyUser, надеюсь, поможет ответить на этот вопрос.
Что я могу сделать?
1 ответ
Вы должны создать экземпляр MyUserManager
и называя его create_superuser
метод со всеми позиционными аргументами. Вы получаете TypeError, потому что фреймворк вызывает create_superuser
без соответствующих позиционных аргументов. Если вы получаете эту ошибку при запуске задачи manage.py, такой как manage.py createsuperuser
тогда это потому, что manage.py пытается вызвать create_superuser
без получения правильного количества аргументов вместе. Эти аргументы обрабатываются путем установки соответствующих полей в вашем MyUser
объект:
Учет дополнительных аргументов в вашем create_superuser
метод
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email', 'created_at']
Есть другие серьезные проблемы с вашим кодом. Из документации "Настройка аутентификации" вы увидите, что вы должны расширять create_user и create_superuser в обоих случаях, поле username_field является первым позиционным аргументом, а в create_superuser пароль является вторым позиционным полем. Я изменил ваш код, чтобы включить create_user
метод в пределах MyUserManager
учебный класс.
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class MyUserManager(BaseUserManager):
def create_user(self, username, password, email, created_at):
"""
Creates and saves a User with the given username, password, email, created_a
birth and password.
"""
if not username:
raise ValueError('Users must have a username')
if not email:
raise ValueError('Users must have an email address')
user = self.model(
username=username,
email=self.normalize_email(email),
created_at=created_at,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, username, password, email, created_at):
user = self.create_user(username, password, email, created_at)
user.is_admin = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser):
email = models.EmailField(
verbose_name = 'email address',
max_length = 255,
unique = True,
)
username = models.CharField(
max_length = 100,
unique = True,
db_index = True,
)
created_at = models.DateField()
is_active = models.BooleanField(default = True)
is_admin = models.BooleanField(default = False)
objects = MyUserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email', 'created_at']
def get_full_name(self):
return self.email
def get_short_name(self):
return self.username
def __unicode__(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.is_admin
Наконец, вам нужно закончить работу с примером, чтобы все было правильно настроено, следуйте полному примеру