Django中自帶的User Model使用起來是比較友善的,但是一般跟我們系統的需求有些出入,或者少了一些必要的屬性,或者多了些不必要的屬性,這是就需要我們自己定義User Model,自定義使用者子產品。
雖然自定義了使用者子產品,但是不影響Django原有的使用者認證體系。
1.
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
class ANUserManager(BaseUserManager):
def create_user(self, username, password=None):
"""
Creates and saves a User with the given
user name and password.
"""
if not username:
raise ValueError(_('Users must have an username'))
user = self.model(
username=username,
)
user.set_password(password)
user.is_admin = False
user.save(using=self._db)
return user
def create_superuser(self, username, password):
"""
Creates and saves a superuser with the given
user name and password.
"""
user = self.create_user(
password=password,
username=username
)
user.is_admin = True
user.save(using=self._db)
return user
class Meta:
verbose_name = _("System User")
verbose_name_plural = _("System User")
2.
class SysUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=100, null=False, verbose_name=_('使用者名'), help_text=_('使用者名'), unique=True, db_index=True )
email = models.EmailField(max_length=254, verbose_name=_('郵件位址'), help_text=_('郵件位址'), null=True, unique=False, blank=True)
phone = models.CharField(max_length=20, verbose_name=_('電話'), help_text=_('電話'), null=True, blank=True, unique=True)
objects = ANUserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = []
def has_perms(self, perm, obj=None):
return True
class Meta:
verbose_name = _("使用者")
verbose_name_plural = _("使用者")
3. 在settings.py中添加一句
AUTH_USER_MODEL = 'app.SysUser'