首页 > 其他分享 >使用django内置User表,继承AbstractBaseUser

使用django内置User表,继承AbstractBaseUser

时间:2022-09-27 11:47:24浏览次数:88  
标签:username superuser self django user AbstractBaseUser password User

使用django内置User表,继承AbstractBaseUser

本篇文章借鉴:https://blog.csdn.net/qq_29892201/article/details/108258457

环境:django 3.2 python3

使用django内置User表,有两种继承方式:

  1. 第一种是直接继承AbstractUser,该类提供的可使用字段多,如下
username:用户名
email: 电子邮件
password:密码
first_name:名
last_name:姓
is_active: 是否为活跃用户。默认是True
is_staff: 是否为员工。默认是False
is_superuser: 是否为管理员。默认是False
date_joined: 加入日期。系统自动生成。
  1. 第二种是继承AbstractBaseUser(提供最基础的用户字段)、PermissionsMixin(提供权限字段)
AbstractBaseUser
password,密码
last_login,最后登录时间

PermissionsMixin
is_super,是否是超级管理员
groups,所属用户组
user_permissions,用户权限组

继承类包导入

from django.contrib.auth.models import AbstractUser, AbstractBaseUser, PermissionsMixin

我只选了AbstractBaseUser这个类,因为对应的业务用不到组、权限这些关系,下面来看下实现

# users/models.py
class User(AbstractBaseUser):
    """
    用户表
    """
    state_value = [
        ('0', '有效'),
        ('1', '无效')
    ]
    username = models.CharField(verbose_name='用户名', primary_key=True, max_length=20, unique=True)
    state = models.CharField(verbose_name='状态', max_length=4, choices=state_value, default='0')
    USERNAME_FIELD = 'username'
    objects = MyMgr()

    def __str__(self):
        return self.username
     
    def has_perm(self, perm, obj=None):
        return self.is_superuser

    def has_module_perms(self, app_label):
        return self.is_superuser

    class Meta:
        db_table = 'ty_user'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

上面增加了一些字段指定行为和对象指定行为

USERNAME_FIELD = 'username'
标识该model类中用哪个字段标识用户名。这个字段指定行为是必要操作,用于django验证用户名密码以及后台登录操作

objects = MyMgr()
这是对象指定行为,主要目的是自定义在使用django-admin创建用户的时候,django的处理逻辑,MyMgr是一个管理类

"""注意:该类写法仅为参照,具体字段按照自定义字段进行分配"""

from django.contrib.auth.models import BaseUserManager


class MyMgr(BaseUserManager):
    """
    重写create_user和create_superuser两个方法
    """
    def create_user(self, username, password=None):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if not username:
            raise ValueError('Users must have an username')

        user = self.model(
            username=username
        )
        user.set_password(password)
        user.is_active = True
        user.is_staff = False
        user.is_superuser = True
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password=None):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        print('---------', username, password)
        user = self.create_user(
            username,
            password=password
        )
        user.save(using=self._db)
        user.is_staff = False
        user.is_superuser = True
        user.is_active = True
        return user

settings中设置

AUTH_USER_MODEL = "users.User"

迁移表

django-admin makemigrations users
django-admin migrate users

如有问题还请指正~~

标签:username,superuser,self,django,user,AbstractBaseUser,password,User
From: https://www.cnblogs.com/yyx0417/p/16733983.html

相关文章