create_user方法是属于UserManger的方法
需求: 自定义User模型
我们想要给user类添加一个字段, 比如phone字段, 但是我们又不想使用一对一的表关系来搞, 所以我们就自定义一个User类
from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager as _UserManager
# 修改UserManager类,这样我们在创建用户的时候就可以不用手动的将email指定为None
class UserManager(_UserManager):
def create_superuser(self, username, password, email=None, **extra_fields):
return super().create_user(username=username, password=password, email=email, **extra_fields)
# 重写User类继承AbstractUser类, 增加一个phone字段
class User(AbstractUser):
phone = models.CharField('手机号', max_length=11, unique=True, help_text='手机号', error_messages={'unique': '此手机号码已注册'})
email_active = models.BooleanField('邮箱状态', default=False)
# 必须字段
REQUIRED_FIELDS = ['phone']
# 将管理器指定为上面我们修改好的类
objects = UserManager()
class Meta:
db_table = 'user'
verbose_name = '用户'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
流程就是我们想要给User类增加一个phone字段, 并且在我们使用create_user的时候,不用必须指定email字段
所以我们重写了UserManage类和继承了AbstractUser类, 然而我们的create_user方法呀, 它的源码是这样的
def create_user(self, username, email=None, password=None, **extra_fields):
extra_fields.setdefault('is_staff', False)
extra_fields.setdefault('is_superuser', False)
return self._create_user(username, email, password, **extra_fields)
意思是他处理一下将是否职员和是否超级用户都设置为了False, 因为防止我们在create_user的时候创建了一个超级用户, 然后返回给_create_user这个私有方法, 这个私有方法啊, 才真正实现了创建用户
但是, 我在重写UserManager类的时候是直接将_create_user方法重写了, 那我们在使用create_user的时候, 注意看参数顺序, 我们在重写的时候将password参数作为了第二个参数, 然而create_user进程return的时候是作为第三个参数,因此凉凉了, 这个问题纠结了半天, 看源码, 然后终于发现了这个问题