繼承自AbstractBaseUser模型
若是你想要修改默認的驗證方式,而且對於User模型上的一些字段不想要,那麼能夠自定義一個模型,而後繼承自AbstractBaseUser,再添加你想要的字段,這種方式會比較麻煩,最好是肯定本身對Django比較瞭解才推薦使用。
(1)建立模型, 示例代碼以下:
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.contrib.auth.models import AbstractUser
class UserManager(BaseUserManager):
def _create_user_(self, telephone, username, password, **kwargs):
if not telephone:
raise ValueError('請輸入密碼!')
if not username:
raise ValueError('請輸入用戶名!')
# 注意,這裏是self.model表明的是當前的User模型而不能寫self.User()由於UserManager沒有這個屬性
user = self.model(telephone=telephone, username=username)
user.set_password(password)
user.save()
return user
def create_user(self, telephone, username, password, **kwargs):
kwargs['is_super'] = False
return self._create_user_(telephone=telephone, username=username, password=password, **kwargs)
def create_superuser(self, telephone, username, password, **kwargs):
kwargs['is_super'] = True
return self._create_user_(telephone=telephone, username=username, password=password, **kwargs)
# PermissionsMixin: 是定義用戶時定義用戶權限,必須繼承
# AbstractBaseUser:User的基類其中涉及的字段最少,若是先定義本身的User模型,
# 將大部分Django中默認的字段刪除的話,就能夠繼承該類
# AbstractBaseUser類中定義的字段有:password,last_login,is_active,is_super
class User(AbstractBaseUser, PermissionsMixin):
# 必須設置的兩個字段username,email
username = models.CharField(max_length=100)
email = models.EmailField(unique=True)
telephone = models.CharField(max_length=11, unique=True)
is_active = models.BooleanField(default=True)
# 惟一性驗證設置爲telephone
USERNAME_FIELD = 'telephone'
# REQUIRED_FIELDS爲空的列表表明的是,在驗證用戶登陸的時候只須要輸入password和USERNAME_FIELD指定的字段就好了
# 若是還想在驗證用戶的時候輸入其餘的字段,那麼就能夠將該字段設置在該列表中。
REQUIRED_FIELDS = []
# 以上自定義的User模型上並無objects方法,因此咱們須要自定義
objects = UserManager()
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
其中password、last_login、is_active都是定義好的字段類型,就不用修改了,
(2)在settings.py中配置AUTH_USER_MODEL='front.User'
(3)在views.py中使用自定義的User模型建立user。示例代碼以下:
<!--1. 建立普通用戶-->
from django.http import HttpResponse
from .models import User
def index(request):
user = User.objects.create_user(telephone='18833332222', username='小龍蝦', password='111111')
user.email = '111111@qq.com'
user.save()
return HttpResponse('success!')
<!--2. 建立超級用戶-->
def index(request):
user = User.objects.create_superuser(telephone="18833337777", username='雲中雲', password='888888')
user.email = '111111@qq.com'
user.save()
return HttpResponse('success!')
(4)此時,一樣可使用外鍵與自定義的User模型相關聯,示例代碼以下:
from django.contrib.auth import get_user_model
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.CharField(max_length=100)
<!--在使用外鍵的時候,可使用get_user_model()函數動態的獲取關聯的模型,這個模型是從settings.py文件中的AUTH_USER_MODEL中讀取的。-->
author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)