指定自定义用户模型
Django 的内置 User
模型并不总是适合某些项目。在某些网站上,使用电子邮件地址而不是用户名可能更有意义。
你可以在项目设置文件中覆盖将自定义 User
模型添加到 AUTH_USER_MODEL
设置的默认 User
模型:
AUTH_USER_MODEL = 'myapp.MyUser'
请注意,强烈建议在创建任何迁移或首次运行 manage.py migrate
之前创建 AUTH_USER_MODEL
。由于 Django 的 synamic dependecy 功能的限制。
例如,在你的博客上,你可能希望其他作者能够使用电子邮件地址而不是常规用户名登录,因此我们创建了一个自定义 User
模型,其电子邮件地址为 USERNAME_FIELD
:
from django.contrib.auth.models import AbstractBaseUser
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
USERNAME_FIELD = 'email'
通过继承 AbstractBaseUser
,我们可以构建一个兼容的 User
模型。AbstractBaseUser
提供了 User
模型的核心实现。
为了让 Django manage.py createsuperuser
命令知道需要哪些其他字段,我们可以指定 REQUIRED_FIELDS
。这个值对 Django 的其他部分没有影响!
class CustomUser(AbstractBaseUser):
...
first_name = models.CharField(max_length=254)
last_name = models.CharField(max_length=254)
...
REQUIRED_FIELDS = ['first_name', 'last_name']
为了符合 Django 的其他部分,我们仍然必须指定值 is_active
,函数 get_full_name()
和 get_short_name()
:
class CustomUser(AbstractBaseUser):
...
is_active = models.BooleanField(default=False)
...
def get_full_name(self):
full_name = "{0} {1}".format(self.first_name, self.last_name)
return full_name.strip()
def get_short_name(self):
return self.first_name
你还应该为你的 User
模型创建一个自定义 UserManager
,它允许 Django 使用 create_user()
和 create_superuser()
函数:
from django.contrib.auth.models import BaseUserManager
class CustomUserManager(BaseUserManager):
def create_user(self, email, first_name, last_name, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
)
user.set_password(password)
user.first_name = first_name
user.last_name = last_name
user.save(using=self._db)
return user
def create_superuser(self, email, first_name, last_name, password):
user = self.create_user(
email=email,
first_name=first_name,
last_name=last_name,
password=password,
)
user.is_admin = True
user.is_active = True
user.save(using=self.db)
return user