Django 1.6 AbstractUser不工作

时间:2013-09-17 15:18:33

标签: django

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

models.py

class CustomUser(AbstractUser):
    USERNAME_FIELD = 'email'

CustomUser._meta.get_field_by_name('email')[0]._unique=True

settings.py

AUTH_USER_MODEL = 'myapp.CustomUser'

执行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.

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

顺便说一下,如果我从我的代码中删除USERNAME_FIELD ='email'并更改核心django auth / models.py>> AbstractUser定义,它的工作原理。我似乎无法覆盖USERNAME_FIELD ...

谢谢!

3 个答案:

答案 0 :(得分:6)

正如错误消息所明确的那样,原因是AbstractUser定义了REQUIRED_FIELDS = ['email']。而且,您无法在REQUIRED_FIELDS中将字段设置为USERNAME_FIELD。更多细节here

因此,如果您希望将email作为主要字段,那么前进的方法是在email而不是AbstractBaseUser上扩展和重新定义字段AbstractUser

如果我没有完全掌握您的要求,此question/answer pair也可能与您相关。

答案 1 :(得分:4)

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

这解决了REQUIRED_FIELDS不能包含USERNAME_FIELD的初始问题,因为我不想重新定义整个用户并扩展AbstractBaseUser,我不得不在REQUIRED_FIELD中包含'username',否则syncdb因其他原因而失败(为了将其保存到数据库中,期望用户名):

self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
TypeError: create_superuser() takes exactly 4 arguments (3 given)

因此,当第一次执行syncdb并且必须输入超级用户时,必须输入两次电子邮件,电子邮件和用户名。它很尴尬,但它是最干净的,我可以忍受它。

干杯!

答案 2 :(得分:1)

乔斯维奇击中了头部,但我想提供我用过的解决方案。这很简单。

  1. USERNAME_FIELD移除“电子邮件”或您正在使用的任何内容REQUIRE_FIELDS

  2. 在您创建的UserManager中,只需写下:

    如果不是电子邮件:     提高ValueError('用户必须有电子邮件地址')

  3. 这样,您就可以手动强制要求发送电子邮件。

    此解决方案是在此处使用的解决方案:https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#a-full-example