Как решить TypeError: create_superuser () получил неожиданный аргумент ключевого слова 'paid' в django - PullRequest
0 голосов
/ 03 октября 2019

Я реализую пользовательскую модель, расширяющую AbstractBaseUser. Вот мой файл account / models.py.

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)


class MyUserManager(BaseUserManager):
    def create_user(self, email, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not email:
            raise ValueError('Users must have an email address')

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

    def create_superuser(self, email, password):
        """
        Creates and saves a superuser with the given email, password.
        """
        user = self.create_user(
            email,
            password=password
        )

        user.paid = True
        user.is_superuser = True
        user.is_admin = True
        user.is_staff = True
        user.save(using=self._db)
        return user

class MyUser(AbstractBaseUser):
    email = models.EmailField(max_length=60, unique=True)
    date_joined = models.DateTimeField(verbose_name="date joined", auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="last login", auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    paid = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False) 
    is_staff = models.BooleanField(default=False)

    list_filter = ()  # Con
    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ("paid",)
    objects = MyUserManager()

    def __str__(self):
        return self.email

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

    def has_module_perms(self, app_label):
       return self.is_admin

Но я получаю ошибку при создании суперпользователя с помощью команды python manage.py runserver

Это то, что я получил от терминала:

Email: i@j.com
Paid: True
Password: 
Password (again): 
Traceback (most recent call last):
    File "manage.py", line 21, in <module>
        main()
    File "manage.py", line 17, in main
        execute_from_command_line(sys.argv)
    File "/home/rhidwan/Desktop/shotave/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
        utility.execute()
    File "/home/rhidwan/Desktop/shotave/venv/lib/python3.7/site-packages/django/core/management/__init__.py", line 375, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/home/rhidwan/Desktop/shotave/venv/lib/python3.7/site-packages/django/core/management/base.py", line 323, in run_from_argv
    self.execute(*args, **cmd_options)
    File "/home/rhidwan/Desktop/shotave/venv/lib/python3.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 61, in execute
    return super().execute(*args, **options)
    File "/home/rhidwan/Desktop/shotave/venv/lib/python3.7/site-packages/django/core/management/base.py", line 364, in execute
      output = self.handle(*args, **options)
    File "/home/rhidwan/Desktop/shotave/venv/lib/python3.7/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 156, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
TypeError: create_superuser() got an unexpected keyword argument 'paid'

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

Заранее спасибо

Редактировать Вот как я решил проблему. Я удалил все свои миграции, а затем изменил платное поле на is_paid. А затем снова примените миграцию, и она работает как шарм.

Спасибо всем, кто много помог, чтобы решить проблему.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

При использовании REQUIRED_FIELDS в вашей пользовательской модели команда python manage.py createsuperuser предложит вам ввести необходимые поля, а затем отправит поле в модуль create_superuser вашего менеджера.

Поскольку вы уже инициализируете платное поле в своем методе create_superuser(), вы можете выполнить одно из следующих действий:

  1. Если вы хотите установить платный параметр в командеподскажите, удалите paid=True из функции create_superuser() и измените ее следующим образом:
    def create_superuser(self, *args, **kwargs):
        """
        Creates and saves a superuser with the given email, password.
        """
        user = self.create_user(
            **kwargs
        )
        user.is_superuser = True
        user.is_admin = True
        user.is_staff = True
        user.save(using=self._db)
        return user
Или, если вы хотите быть конкретным с параметрами, вы можете передать оплаченный параметр в аргументы функции:
def create_superuser(self, email, password, paid):
        """
        Creates and saves a superuser with the given email, password.
        """
        user = self.create_user(
            email,
            password=password
        )

        user.paid = True
        user.is_superuser = True
        user.is_admin = True
        user.is_staff = True
        user.save(using=self._db)
        return user

Если paid=True всегда является истинным условием для SUPERUSER, вы можете удалить его из REQUIRED_FIELDS, но это также будет удалено для обычного пользователя, но по умолчанию будет установлено значение False в соответствии с вашими моделями.
1 голос
/ 03 октября 2019

Ваш create_superuser не принимает ни одного ключевого аргумента paid. Он просто принимает email и password. Но вы добавили его в REQUIRED_FIELDS , поэтому при создании суперпользователя оно будет передано create_superuser.

Вам необходимо обновить create_superuser и create_user методы для принятия этого поля.

Одно простое решение - изменить:

def create_superuser(self, email, password):
    ...
    user = self.create_user(
        email,
        password=password
    )

На:

def create_superuser(self, email, password, **extra_fields):
    ...
    user = self.create_user(
        email,
        password=password,
        **extra_fields,
    )

И изменить:

def create_user(self, email, password=None):
    ...
    user = self.model(
        email=self.normalize_email(email)
    )

Кому:

def create_user(self, email, password, **extra_fields):
    ...
    user = self.model(
        email=self.normalize_email(email),
        **extra_fields,
    )

После этого в будущем вы сможете добавлять и другие поля в REQUIRED_FIELDS без изменения кода.

...