TypeError: create_superuser() missing 2 required positional arguments

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

  File "/mnt/c/Users/ZAKARIA/Desktop/project/env/lib/python3.8/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 232, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(
TypeError: create_superuser() missing 2 required positional arguments: 'first_name' and 'last_name'

менеджеры моих классов

from django.contrib.auth.base_user import BaseUserManager

class UserManger(BaseUserManager):
    def create_user(self, email, first_name, last_name, password=None):
        if not email:
            raise ValueError("Users must have an email address")
        if not first_name or last_name:
            raise ValueError("Users must have a first and last name")

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

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

    def create_superuser(self, email,password, first_name, last_name):
        user = self.create_user(
            email=self.normalize_email(email),
            password=password,
            first_name=first_name,
            last_name=last_name,
        )
        user.set_password(user.password)
        #user.is_staff = True
        user.is_superuser = True
        #user.is_admin = True
        user.save(using=self._db)
        return user

Я вижу много вопросов, похожих на этот, но я все еще не понимаю ответов, некоторые говорят добавить позиционные аргументы, я не совсем понимаю

может ли кто-нибудь помочь мне решить эту проблему?

Вероятно, это связано с тем, что у вас есть дополнительные поля в UserModel, которые не передаются точно в create_superuser.

Попробуйте **extra_fields arg вместо передачи first_name, last_name отдельно, как советует документация о методах менеджера ,

Аргументы ключевого слова extra_fields передаются в метод User's init, чтобы позволить установить произвольные поля в пользовательской модели пользователя.

Итак, измените ваш UserManger класс в соответствии с этим, и тогда это устранит проблему.

Модифицированный код:

class UserManger(BaseUserManager):
    """Define a model manager for User model"""

    def _create_user(self, email, password=None, **extra_fields):
        """Create and save a User with the given email and password."""
        if not email:
            raise ValueError('The given email must be set')
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', False)
        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password=None, **extra_fields):
        """Create and save a SuperUser with the given email and password."""
        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(email, password, **extra_fields)

Теперь вы можете установить first_name, last_name, как REQUIRED_FIELDS в UserModel, вот так.

 REQUIRED_FIELDS = ['first_name' , 'last_name']

Для получения подробной информации о BaseUserManager вы также можете ознакомиться с Docs

Правка: После просмотра вашей UserModel, было бы лучше использовать AbstractUser вместо AbstractBaseUser, AbstractUser будет содержать все поля, которые есть у пользователя Django по умолчанию. Поэтому вам не придется определять такие поля, как first_name, last_name, is_staff или т.д...

Вот как его можно модифицировать

# import
from django.contrib.auth.models import AbstractUser

# Model 
class User(AbstractUser):
    username = None # as you are using email as username
    email = models.EmailField(
        verbose_name='email address',
        max_length=255,
        unique=True,
    )
    date_of_birth = models.DateField()
    gender = models.CharField(max_length=1, choices=GENDER_CHOICES, blank=True)
    picture = models.ImageField(
        upload_to='images/users', null=True, verbose_name="")
    phone = PhoneNumberField()
    is_admin = models.BooleanField(default=False)
    #credits =models.PositiveIntegerField(default=100)
    linkedin_token = models.TextField(blank=True, default='')
    expiry_date = models.DateTimeField(null=True, blank=True)

    objects = UserManger()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name' , 'last_name'] 
    # Do anything else here 

Отсутствуют 2 необходимых позиционных аргумента: 'request' и 'eml' Если вы столкнулись с этой ошибкой и используете представление на основе класса, пожалуйста, удалите self и другие параметры, которые определены в функции. Для правильной работы вашей функции в качестве параметра нужен только запрос. Я просто делюсь своим опытом, потому что я потерял много времени из-за этой ошибки.

def delete(self, request, eml):
print(request.GET.get('d_id'))
return HttpResponse('delete')

У меня все работает нормально.

def delete(request):
 print(request.GET.get('d_id'))
 return HttpResponse('delete')

Если вы используете представление на основе класса, то даже тогда удалите параметр self из метода. Надеюсь, это поможет вам.

Вернуться на верх