1

我尝试执行“./manage.py syncdb”,并提示我创建一个超级用户,但它失败了:

  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/src/django-trunk/django/core/management/__init__.py", line 397, in execute_from_command_line
    utility.execute()
  File "/home/<USER>/.virtualenvs/<DOMAIN>/src/django-trunk/django/core/management/__init__.py", line 390, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/src/django-trunk/django/core/management/base.py", line 240, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/src/django-trunk/django/core/management/base.py", line 283, in execute
    output = self.handle(*args, **options)
  File "/home/<USER>/.virtualenvs/<DOMAIN>/src/django-trunk/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() takes exactly 4 arguments (3 given)

这是我的用户资料:

from django.db import models
from django.conf import settings
from django.contrib.auth.models import UserManager, AbstractUser



class UserProfile(AbstractUser):
    membernumber = models.CharField(max_length=20, blank=True, unique=True)
    mobile = models.CharField(max_length=20, blank=True)
    updated = models.DateTimeField(blank=True, null=True)    

    USERNAME_FIELD = 'membernumber'

    objects = UserManager()

也许问题是我已经运行了“syncdb”并且在唯一字段上有“blank=True”?

4

2 回答 2

1

您应该定义自己的 Manager 来代替默认值UserManager

作为你的例子:

class MyManager(UserManager):
    def create_superuser(self, membernumber,email,password,**extra_fields):
        super().create_superuser(membernumber,email,password,**extra_fileds)
        #or do something to save your model by yourself;

为什么我们需要这样做?

看看你的错误转储

self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)

因此,当您python manage.py createsuperuser在 shell 上运行时,输入您的membernumber, password,email值后,您user_data将变为:

{'membernumber':'Garreth','password':'123456','email':'like@gamil.com'}

UserManager.create_superuser需要username参数,你想念它!所以你得到那个错误。

这是UserManager.create_superuser(参考1)的来源

def create_superuser(self, username, email, password, **extra_fields):
    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(username, email, password, **extra_fields)

还有一些关于你运行时运行的信息python manage.py createsuperuser(参考 2)

if username:
    user_data[self.UserModel.USERNAME_FIELD] = username
    user_data['password'] = password

    self.UserModel._default_manager.db_manager(database)
        \.create_superuser(**user_data)
    if options['verbosity'] >= 1:
        self.stdout.write("Superuser created successfully.")

建议:

如果你仍然想执行python manager.py createsuperuser,你不应该定义一个继承的自定义用户模型AbstractBaseUser,因为django.contrib.admindjango.contrib.auth使用太多的AbstractUser模型属性,比如is_active,,is_superuser所以当你yousite.com/admin在浏览器上访问时会出现很多错误。

指:

1. https://github.com/django/django/blob/master/django/contrib/auth/models.py#L156

2. https://github.com/django/django/blob/master/django/contrib/auth/management/commands/createsuperuser.py#L170

于 2016-01-12T18:59:41.633 回答
0

书中说:

选项 2:子类 AbstractUser:

如果您喜欢 Django 的用户模型字段,但需要额外的字段,请选择此选项。

也许你必须继承 AbstractBaseUser。请参阅此处或完整示例。

编辑

USERNAME_FIELD如果您想使用另一个用户名字段,则应使用。如果你想要那个,你必须继承AbstractBaseUser而不是AbstractUser,因为最后一个已经定义了USERNAME_FIELD

希望有所帮助!

于 2013-06-27T12:19:10.857 回答