指定自定義使用者模型
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