上一篇我們自定義的 User 并未包含 Django 自帶的權(quán)限模塊咳燕,現(xiàn)在我們自定義一個能使用權(quán)限模塊的自定義 User勿决。
要自定義包含原權(quán)限模塊的 User 模型,只需要讓 User 模型繼承 AbstractBaseUser 類的同時還繼承 PermissionsMixin 類招盲。
Django 提供的 PermissionsMixin 是一個抽象模型剥险,為您提供支持 Django 權(quán)限模型所需的所有方法和數(shù)據(jù)庫字段。
PermissionsMixin 提供了以下方法和屬性:
- is_superuser
- get_group_permissions(obj=None)
- get_all_permissions(obj=None)
- has_perm(perm, obj=None)
- has_perms(perm_list, obj=None)
- has_module_perms(package_name)
下面是一個包含 Permission 的自定義 User 模型例子:
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin
)
class MyUserManager(BaseUserManager):
def _create_user(self, email, password, date_of_birth, is_staff, is_superuser, **extra_fields):
if not email:
raise ValueError('The given email must be set')
email = self.normalize_email(email)
user = self.model(
email=email,
date_of_birth=date_of_birth,
is_staff=is_staff,
is_active=True,
is_superuser=is_superuser,
**extra_fields
)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, email, date_of_birth, password=None, **extra_fields):
return self._create_user(email, password, date_of_birth, is_staff=False, is_superuser=False, **extra_fields)
def create_superuser(self, email, date_of_birth, password, **extra_fields):
return self._create_user(email, password, date_of_birth, is_staff=True, is_superuser=True, **extra_fields)
class MyUser(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
)
date_of_birth = models.DateField()
# 管理類屬性
is_active = models.BooleanField(default=True)
# is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
# 指定 MyUser 模型的管理器
objects = MyUserManager()
# 描述User模型上用作唯一標識符的字段名稱
# 字段必須必須是唯一的(即在其定義中設(shè)置unique=True)
USERNAME_FIELD = 'email'
# 當通過createsuperuser管理命令創(chuàng)建一個用戶時
# 系統(tǒng)會提示用戶輸入以下字段
REQUIRED_FIELDS = ['date_of_birth']
# 返回 email 地址
def get_full_name(self):
return self.email
# 返回 email 地址
def get_short_name(self):
return self.email
def __str__(self): # __unicode__ on Python 2
return self.email
別忘了在 setting.py 中加上以下內(nèi)容:
AUTH_USER_MODEL = 'myUserApp.MyUser'
在 shell 中檢驗我們自定義的 User 模型宪肖。
創(chuàng)建一個 superuser:
from myUserApp.models import MyUser
u = MyUser.objects.create_superuser(
email='user_001@django.com',
date_of_birth='1988-8-8',
password='********',
)
查看全部權(quán)限:
u.get_all_permissions()
>>> {'auth.add_group', 'myUserApp.delete_myuser', 'auth.delete_group',
'sessions.change_session', 'myUserApp.change_myuser',
'admin.add_logentry', 'contenttypes.change_contenttype',
'myUserApp.add_myuser', 'auth.add_permission',
'contenttypes.add_contenttype', 'admin.delete_logentry',
'contenttypes.delete_contenttype', 'auth.delete_permission',
'auth.change_group', 'auth.change_permission', 'admin.change_logentry',
'sessions.add_session', 'sessions.delete_session'}