问题描述
我想使用电子邮件字段作为我的自定义用户模型的用户名字段。
我有以下自定义用户模型子类Django的AbstractUser模型:
I want to use an email field as the username field for my custom user model.I have the following custom User model subclassing Django's AbstractUser model:
class CustomUser(AbstractUser):
....
email = models.EmailField(max_length=255, unique=True)
USERNAME_FIELD = 'email'
但是当我运行
我收到以下错误:
我包括我自己的电子邮件字段首先是向其添加 unique = True
选项。否则我得到:
The reason I include my own email field in the first place is to add the unique=True
option to it. otherwise I get:
现在,关于这个:
如何可以实现此目的? (除此之外,另外命名为user_email或类似的内容)
Now, in respect to this:https://docs.djangoproject.com/en/1.5/topics/db/models/#field-name-hiding-is-not-permitted
How can I achieve this? (other then naming the field "user_email" or something like that instead)
推荐答案
Ian非常感谢您的聪明回应:)
Ian, thank you very much for the clever response :)
但是,我已经修补了我一个解决方案。
However, I've already "patched" me a solution.
由于 AbstractUser
还有一个用户名
我没有必要为我
我决定创建我的自己的 AbstractUser
。
Since AbstractUser
also have a username
field which is totaly unnecessary for me
I decided to create my "own" AbstractUser
.
由子类化 AbstractBaseUser
和 PermissionsMixin
我保留了大部分用户模型内置方法,而不添加任何代码。
By subclassing AbstractBaseUser
and PermissionsMixin
I retain most of the User model built-in methods without adding any code.
我也利用这个机会创建一个自定义的管理器
,以消除在 username
字段在一起:
I also took advantage of that opportunity to create a custom Manager
to eliminate the use in username
field all together:
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
class CustomUser(AbstractBaseUser, PermissionsMixin):
....
email = models.EmailField(max_length=255, unique=True)
first_name = ...
last_name = ...
is_active = ...
is_staff = ...
....
objects = CustomUserManager()
USERNAME_FIELD = 'email'
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
.....
def create_superuser(self, email, password, **extra_fields):
.....
此解决方案确实导致Django的内置代码重复(主要是 AbstractUser
中已经存在的模型字段,例如'first_name',' last_name'等),而且在一个更干净的用户对象和数据库表中。
This solution does result in repetition of some of Django's built-in code (mainly model fields that already exist in AbstractUser
such as 'first_name', 'last_name' etc.) but also in a cleaner User object and database table.
这是一个真正的耻辱,在1.5中引入了 USERNAME_FIELD
不能用于实际在所有现有约束下创建灵活的用户模型。
It is a real shame that the flexibily introduced in 1.5 with USERNAME_FIELD
can not be used to actualy create a flexible User model under all existing constrains.
编辑:有一个官方文档中提供了全面的工作示例:
There is a comprehensive worked example available in the official docs: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example
这篇关于在Django 1.5自定义用户模型中使用email作为用户名字段导致FieldError的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!