尝试创建我的自定义用户模型,这是我的代码:
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 ...
谢谢!
答案 0 :(得分:6)
正如错误消息所明确的那样,原因是AbstractUser
定义了REQUIRED_FIELDS = ['email']
。而且,您无法在REQUIRED_FIELDS
中将字段设置为USERNAME_FIELD
。更多细节here。
因此,如果您希望将email
作为主要字段,那么前进的方法是在email
而不是AbstractBaseUser
上扩展和重新定义字段AbstractUser
。
如果我没有完全掌握您的要求,此question/answer pair也可能与您相关。
答案 1 :(得分:4)
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)
从USERNAME_FIELD
移除“电子邮件”或您正在使用的任何内容REQUIRE_FIELDS
。
在您创建的UserManager中,只需写下:
如果不是电子邮件: 提高ValueError('用户必须有电子邮件地址')
这样,您就可以手动强制要求发送电子邮件。
此解决方案是在此处使用的解决方案:https://docs.djangoproject.com/en/1.7/topics/auth/customizing/#a-full-example