实现自定义用户模型时创建超级用户出现问题

12 投票
3 回答
11116 浏览
提问于 2025-04-18 16:48

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

看起来这应该很简单,但我就是搞不明白为什么会出现这个错误,因为我在创建超级用户的函数中确实指定了电子邮件。我查阅了几个在线教程,但没有看到有什么不同的实现。有人能解释一下我哪里做错了吗?

3 个回答

-1

解决办法:检查一下你所需字段(REQUIRED_FIELDS)的拼写是否正确。

4
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']

对我来说,上面的代码简单地解决了问题。

16

看一下这个代码,管理命令只会询问用户模型中REQUIRED_FIELDS属性里的字段(还有用户名)。这个属性在AbstractBaseUser中默认包含电子邮件,但如果你修改了这个属性,或者根本没有从这个模型继承(其实你应该这样做),那么系统就不会询问电子邮件,也不会把它传递给create_superuser方法。

撰写回答