django的create_user方法

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的时候是作为第三个参数,因此凉凉了, 这个问题纠结了半天, 看源码, 然后终于发现了这个问题

发布了29 篇原创文章 · 获赞 3 · 访问量 4676

猜你喜欢

转载自blog.csdn.net/weixin_44898301/article/details/104938880