TypeError: MyAccountManager.create_superuser() отсутствуют 3 обязательных позиционных аргумента: 'first_name', 'last_name' и 'username'.

Когда я запускаю следующую команду: 'python manage.py createsuperuser', она запрашивает только email и пароль. и как только я нажимаю enter, появляется ошибка, запрашивающая 3 других обязательных поля.

Как можно заполнить эти поля, если меня даже не просят их заполнять?

models.py :

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
# Create your models here.


class MyAccountManager(BaseUserManager):
    def create_user(self,first_name,last_name,username,email,password=None):
        if not email:
            raise ValueError('User must have an email address')
        

        if not username:
            raise ValueError('User must have an username ')
        

        user=self.model(

            email=self.normalize_email(email),
            username=username,
            first_name=first_name,
            last_name=last_name,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user


    def create_superuser(self,first_name,last_name,email,username,password):

        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            password=password,
            first_name=first_name,
            last_name=last_name,
        )
        user.is_admin=True
        user.is_active=True
        user.is_staff=True
        user.is_superadmin=True
        user.save(using=self._db)
        return user
    



class Account(AbstractBaseUser):
    first_name=models.CharField(max_length=30)
    last_name=models.CharField(max_length=30)
    username=models.CharField(max_length=30, unique=True)
    email=models.EmailField(max_length=100, unique=True)
    phone_number=models.CharField(max_length=30)


    #required
    date_joined=models.DateTimeField(auto_now_add=True)
    last_login=models.DateTimeField(auto_now_add=True)
    is_admin=models.BooleanField(default=False)
    is_staff=models.BooleanField(default=False)
    is_active=models.BooleanField(default=False)
    is_superadmin=models.BooleanField(default=False)


    USERNAME_FIELD='email'
    REQUIRED_FIELD=['username','first_name','last_name']
    
    objects = MyAccountManager()


    def _str_(self):
        return self.email
    

    def has_perm(self,perm,obj=None):
        return self.is_admin
    

    def has_module_perm(self,add_label):
        return True

Я пробовал множество других решений, но ни одно из них не помогло, если кто-то из вас сталкивался с этой проблемой, не могли бы вы помочь мне разобраться с ней

Основной проблемой является атрибут REQUIRED_FIELDS [Django-doc], он должен быть REQUIRED_FIELDS (множественное число), а не REQUIRED_FIELD.

Но кроме этого, это не хорошая идея менять сигнатуры методов .create_user(…) [Django-doc] и .create_superuser(…) [Django-doc]. Просто оставьте их одинаковыми, чтобы другие плагины могли использовать эту логику:

class MyAccountManager(BaseUserManager):
    def create_user(
        self,
        username,
        email,
        password=None,
        first_name=None,
        last_name=None,
        **extra_fields
    ):
        if not email:
            raise ValueError('User must have an email address')

        if not username:
            raise ValueError('User must have an username ')

        user = self.model(
            email=self.normalize_email(email),
            username=username,
            first_name=first_name,
            last_name=last_name,
            **extra_fields
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(
        self,
        username,
        email,
        password=None,
        first_name=None,
        last_name=None,
        **extra_fields
    ):
        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            password=password,
            first_name=first_name,
            last_name=last_name,
            **extra_fields
        )
        user.is_admin = True
        user.is_active = True
        user.is_staff = True
        user.is_superadmin = True
        user.save(using=self._db)
        return user
Вернуться на верх