Джанго не может создать суперпользователя

Я хочу написать блог с 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

Наконец, вам нужно закончить работу с примером, чтобы все было правильно настроено, следуйте полному примеру

Другие вопросы по тегам