django自定义用户系统


发布时间:2019-02-15 13:08    作者: Uncle Hui   已过去:1 年,7 月   阅读总量:660 已被赞:1


Django内建的User模型可能不适合某些类型的项目。例如,在某些网站上使用邮件地址而不是用户名作为身份的标识可能更合理。因此我们需要重写用户系统。

第一步:新建一个app,用于对用户系统的管理

我在apps/xfzauth 新建了一个app叫xfzauth

第二步:、

在xfzauth/models,py

写好用户系统

from django.db import models
from shortuuidfield import ShortUUIDField #导入安装的迷你版UUID  pip install django-shortuuidfield
# Create your models here.
#重写User,需要导入并继承两个基类******
from django.contrib.auth.models import AbstractBaseUser,PermissionsMixin,BaseUserManager
#******end

#定义创建用户的方法create_user方法和create_superuser
#需要继承基类BaseUserManager
class UserManager(BaseUserManager):
    #定义一个受保护的内部创建用户的方法
    def _create_user(self,telephone,username,password,**kwargs):
        if not telephone:
            raise ValueError('请传入手机号码!')
        if not username:
            raise ValueError('请传入用户名!')
        if not password:
            raise ValueError('请传入密码!')
        user = self.model(telephone=telephone,username=username,**kwargs)
        user.set_password(password)
        user.save()
        return user
     #创建一个创建普通用户的方法
    def create_user(self,telephone,username,password,**kwargs):
        kwargs['is_superuser'] = False
        return self._create_user(telephone, username, password, **kwargs)
    
     #创建一个创建超级用户的方法
      def create_superuser(self,telephone,username,password,**kwargs):
          kwargs['is_superuser'] = True
          kwargs['is_staff'] = True
          return self._create_user(telephone,username,password,**kwargs)



class User(AbstractBaseUser,PermissionsMixin):
    #使用SHORTUUID来做为主键,代替默认的整形数字,隐私性更强
    #安装:pip install django-shortuuidfield
    uid = ShortUUIDField(primary_key=True)
    telephone=models.CharField(max_length=11,unique=True)
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True) #必须
    is_staff = models.BooleanField(default=False) #是否为员工,是可以进入CMS系统
    data_joined=models.DateTimeField(auto_now_add=True)

    USERNAME_FIELD = 'telephone' #指定USERNAME_FIELD,就是指定了登陆验证的字段,
    #如果不指定,就默认为uesrname
    REQUIRED_FIELDS = ['username']#指定REQUIRED_FIELDS,就是在使用
    # createsuperuser命令创建用户,
    #的时候,需要填写的字段,这里使用了username,密码和手机号字段自动就有了。
    EMAIL_FIELD = 'email' #给指定的用户发送邮件

    objects = UserManager() #创建obj方法,将UserManager()给他

    #必须定义。 long格式的用户标识
    def get_full_name(self):
        return self.username

    #必须定义。 short格式的用户标识。
    def get_short_name(self):
        return  self.username

第三步:settings.py 

指定user模型的路径

#重写了uesr模型,需要在这里指定它的位置
AUTH_USER_MODEL = 'xfzauth.User'  #APP名+模型名就可以了,不要用完整路径

第四步:xfzauth注册

'apps.xfzauth',#网站的用户管理系统,自己重写

注意:

1.在创建任何迁移或者第一次运行 manager.py migrate 前设置 AUTH_USER_MODEL
设置AUTH_USER_MODEL对你的数据库结构有很大的影响。它改变了一些会使用到的表格,并且会影响到一些外键和多对多关系的构造。在你有表格被创建后更改此设置是不被 makemigrations 支持的,并且会导致你需要手动修改数据库结构,从旧用户表中导出数据,可能重新应用一些迁移。

警告 :
1.确保 AUTH_USER_MODEL 引用的模型在所属app中第一个迁移文件中被创建
由于Django的可交换模型的动态依赖特性的局限,你必须确保 AUTH_USER_MODEL 引用的模型在所属app中第一个迁移文件中被创建(通常命名为 0001_initial),否则你会碰到错误。

The easiest way to construct a compliant custom User model is to inherit fromAbstractBaseUser. AbstractBaseUser provides the core implementation of a Usermodel, including hashed passwords and tokenized password resets. You must then provide some key implementation details:

本文参考了这篇博文https://blog.csdn.net/weixin_40744265/article/details/80745652  更多细节点击前往

点赞

1




登陆后方可评论