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

Posted

技术标签:

【中文标题】实现自定义用户模型时 createsuperuser 的问题【英文标题】:Issue with createsuperuser when implementing custom user model 【发布时间】:2014-10-04 00:55:44 【问题描述】:

我正在尝试在 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'

这是我的用户管理器

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 函数中指定了电子邮件。我在网上浏览了几个教程,看不出这是如何以不同的方式实现的。有人可以解释我做错了什么吗?

【问题讨论】:

如何调用 UserManager.create_superuser()?你给它一个叫email的参数吗? 我正在通过./manage.py createsuperuser 调用它,并且在它应该要求发送电子邮件的地方得到了这个异常。 【参考方案1】:

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

【讨论】:

感谢在必填字段中添加了电子邮件,它有效【参考方案2】:
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】:

解决方案: 检查您的 REQUIRED_FIELDS 的拼写

【讨论】:

以上是关于实现自定义用户模型时 createsuperuser 的问题的主要内容,如果未能解决你的问题,请参考以下文章

Django allauth 自定义登录表单未呈现自定义用户模型中的所有字段

保存自定义用户模型时 Django ManyToMany 覆盖

使用 Django-rest-auth 创建新用户时创建自定义用户模型

Django 管理员无法使用自定义用户模型正确登录

何时在 Django 1.5 中使用自定义用户模型

如何在 DRF + django-rest-auth 中使用自定义用户模型保存注册时的额外字段