Django 1.6 AbstractUser不工作

Rok*_*Rok 5 django

试图创建我的自定义用户模型,这是我的代码:

models.py

class CustomUser(AbstractUser):
    USERNAME_FIELD = 'email'

CustomUser._meta.get_field_by_name('email')[0]._unique=True
Run Code Online (Sandbox Code Playgroud)

settings.py

AUTH_USER_MODEL = 'myapp.CustomUser'
Run Code Online (Sandbox Code Playgroud)

执行manage.py syncdb时,会发生以下错误:

CommandError: One or more models did not validate:
myapp.customuser: The field named as the USERNAME_FIELD should not be included in REQUIRED_FIELDS on a swappable User model.
Run Code Online (Sandbox Code Playgroud)

任何人都能解释一下吗?有没有更好的方法在Django 1.6中自定义用户模型而不重写扩展AbstractBaseUser的整个类?

顺便说一句,如果我从我的代码中删除USERNAME_FIELD ='email'并更改核心django auth/models.py >> AbstractUser定义,它就可以了.我似乎无法覆盖USERNAME_FIELD ...

谢谢!

Jos*_*mit 6

正如错误消息所明确的那样,原因是AbstractUser定义REQUIRED_FIELDS = ['email'].你不能在某个字段设置REQUIRED_FIELDS为你的USERNAME_FIELD.更多细节在这里.

所以,如果你想email为你的主要领域前进的方向是扩大并重新定义字段email上AbstractBaseUser,而不是AbstractUser.

此问题/答案对可能与您相关,以防我没有完全掌握您的要求.


Rok*_*Rok 6

Josvic,您的解决方案部分解决了我的问题。最后我要做的是:

class CustomUser(AbstractUser):

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    def get_username(self):
        return self.email

CustomUser._meta.get_field_by_name('email')[0]._unique=True
Run Code Online (Sandbox Code Playgroud)

这解决了 REQUIRED_FIELDS 不能包含 USERNAME_FIELD 的初始问题,并且由于我不想重新定义整个 User 并扩展 AbstractBaseUser,我必须在 REQUIRED_FIELD 中包含“用户名”,否则同步数据库因其他原因而失败(预计用户名以便将其保存到数据库中):

self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
TypeError: create_superuser() takes exactly 4 arguments (3 given)
Run Code Online (Sandbox Code Playgroud)

因此,当第一次执行同步数据库并且必须输入超级用户时,必须输入两次电子邮件,作为电子邮件和用户名。这很尴尬,但它是我能忍受的最干净的。

干杯!