代码之家  ›  专栏  ›  技术社区  ›  user3282276

实现自定义用户模型时createsuperuser出现问题

  •  12
  • user3282276  · 技术社区  · 10 年前

    我试图在Django 1.6中实现我自己的自定义用户模型,但我遇到了这个错误。

    Traceback (most recent call last):
      File "./manage.py", line 10, in <module>
        execute_from_command_line(sys.argv)
      File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/__init__.py", line 399, in execute_from_command_line
        utility.execute()
      File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/__init__.py", line 392, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/base.py", line 242, in run_from_argv
        self.execute(*args, **options.__dict__)
      File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/core/management/base.py", line 285, in execute
        output = self.handle(*args, **options)
      File "/Users/gabriel/.virtualenvs/hang_server/lib/python3.4/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 141, in handle
        self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
    TypeError: create_superuser() missing 1 required positional argument: 'email'
    

    这是我的UserManager

    class UserManager(BaseUserManager):
    
      def _create_user(self, username, email, password, is_staff, is_superuser, **extra_fields):
        now = timezone.now()
        email = self.normalize_email(email)
        user = self.model(username=username, email=email,
                 is_staff=is_staff, is_active=False,
                 is_superuser=is_superuser, last_login=now,
                 date_joined=now, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
    
      def create_user(self, username, email=None, password=None, **extra_fields):
        return self._create_user(username, email, password, False, False,
                     **extra_fields)
    
      def create_superuser(self, username, email, password, **extra_fields):
        user=self._create_user(username, email, password, True, True,
                     **extra_fields)
        user.is_active=True
        user.save(using=self._db)
        return user
    

    这看起来很简单,但我似乎无法理解为什么我一开始就出现这个错误,因为我的create_superuser函数中确实指定了电子邮件。我在网上浏览了几篇教程,看不出这是如何以不同的方式实现的。有人能解释我做错了什么吗?

    3 回复  |  直到 10 年前
        1
  •  16
  •   Daniel Roseman    10 年前

    正在查看 the code 对于管理命令,它只提示输入用户模型的 REQUIRED_FIELDS 属性(以及用户名)。默认情况下,该属性在AbstractBaseUser中包含电子邮件,但是如果您已经覆盖了它,或者没有首先从该模型继承(您应该这样做),则不会提示电子邮件,也不会将其传递给create_superuser方法。

        2
  •  4
  •   Steven Nestor    7 年前
    class User(AbstractBaseUser, PermissionsMixin):
        username = models.CharField('username', max_length=150, unique=True)
        email = models.EmailField('email address', unique=True, max_length = 255)
        USERNAME_FIELD = 'username'
        REQUIRED_FIELDS = ['email']
    

    对我来说,上面的代码只是解决了问题。

        3
  •  -1
  •   Deepesh Sharma    3 年前

    解决方案: 检查REQUIRED_FIELDS的拼写