下面是详细的“Django自定义用户User模型的三种方法”的攻略。
1. 为什么要自定义用户模型
默认情况下,Django的用户身份验证系统使用的是django.contrib.auth.models.User
模型。它包含用户名、电子邮件和密码等字段。但是很多时候,我们需要增加一些额外的字段,如性别、出生日期等信息,这就需要自定义用户模型。
2. Django自定义用户模型的三种方法
2.1. 继承AbstractBaseUser 和 PermissionsMixin
在Django中,可以通过继承AbstractBaseUser
和PermissionsMixin
来去掉原有的默认模型,并定义自己的用户模型。
示例代码:
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from django.db import models
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(unique=True)
name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
2.2. 继承AbstractUser
除了AbstractBaseUser
和PermissionsMixin
,我们还可以选择继承AbstractUser
。和继承AbstractBaseUser
和PermissionsMixin
相比,它的实现相对简单。
示例代码:
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
email = models.EmailField(unique=True)
def __str__(self):
return self.email
2.3. 继承AbstractBaseUser并结合继承AbstractUser
在自定义用户模型时,我们也可以结合继承AbstractBaseUser
和继承AbstractUser
。这种方式可以达到“最大灵活性”。
示例代码:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, AbstractUser
from django.db import models
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
class User(AbstractBaseUser, AbstractUser):
email = models.EmailField(unique=True)
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
3. 结语
总之,在Django中,自定义用户模型很容易。可以根据自己的需要来选择最为适合的自定义方式。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django 自定义用户user模型的三种方法 - Python技术站