赞
踩
不建议直接继承user表,user表本身无一句代码,直接继承的AbstractUser
扩展方法一:
使用外键关联,同时可以用信号道 让2个表自动同步
可以通过创建另外一张表去关联User表,从而添加额外字段,并且我们可以写一个接受保存模型的信号处理方法,只要User调用了save方法,那么关联表就会自动添加一条数据与User新添加的用户进行绑定:
- from django.db import models
- from django.contrib.auth.models import User
- from django.dispatch import receiver # 导入receiver监听信号
- from django.db.models.signals import post_save # 导入post_save信号
- class ExtensionUser(object):
- """创建一对一模型,并添加新的字段"""
- user = models.OneToOneField(User,on_delete=models.CASCADE)
- telephone = models.CharField(max_length=11,verbose_name="手机号码")
-
- @receiver(post_save,sender=User) # 监听到post_save事件且发送者是User则执行create_extension_user函数
- def create_extension_user(sender,instance,created,**kwargs):
- """
- sender:发送者
- instance:save对象
- created:是否是创建数据
- """
- if created:
- # 如果创建对象,ExtensionUser进行绑定
- ExtensionUser.objects.create(user=instance)
- else:
- # 如果不是创建对象,同样将改变进行保存
- instance.extension.save()
信号道特征像是一个事件处理,具体用 法可以百度
继承AbstractUser自定义模型:
Django自带的User模型就是继承的AbstractUser类,因此我们可以通过继承AbractUser类自定义User模型:
- from django.contrib.auth.models import BaseUserManager,AbstractUser
- from shortuuidfield import ShortUUIDField # 使用shortuuid作为User表的主键,使数据更加的安全
-
- class UserManager(BaseUserManager): #自定义Manager管理器
- def _create_user(self,username,password,email,**kwargs):
- if not username:
- raise ValueError("请传入用户名!")
- if not password:
- raise ValueError("请传入密码!")
- if not email:
- raise ValueError("请传入邮箱地址!")
- user = self.model(username=username,email=email,**kwargs)
- user.set_password(password)
- user.save()
- return user
-
- def create_user(self,username,password,email,**kwargs): # 创建普通用户
- kwargs['is_superuser'] = False
- return self._create_user(username,password,email,**kwargs)
-
- def create_superuser(self,username,password,email,**kwargs): # 创建超级用户
- kwargs['is_superuser'] = True
- kwargs['is_staff'] = True
- return self._create_user(username,password,email,**kwargs)
-
- class User(AbstractUser): # 自定义User
- GENDER_TYPE = (
- ("1","男"),
- ("2","女")
- )
- uid = ShortUUIDField(primary_key=True)
- username = models.CharField(max_length=15,verbose_name="用户名",unique=True)
- nickname = models.CharField(max_length=13,verbose_name="昵称",null=True,blank=True)
- age = models.IntegerField(verbose_name="年龄",null=True,blank=True)
- gender = models.CharField(max_length=2,choices=GENDER_TYPE,verbose_name="性别",null=True,blank=True)
- phone = models.CharField(max_length=11,null=True,blank=True,verbose_name="手机号码")
- email = models.EmailField(verbose_name="邮箱")
- picture = models.ImageField(upload_to="Store/user_picture",verbose_name="用户头像",null=True,blank=True)
- home_address = models.CharField(max_length=100,null=True,blank=True,verbose_name="地址")
- card_id = models.CharField(max_length=30,verbose_name="身份证",null=True,blank=True)
- is_active = models.BooleanField(default=True,verbose_name="激活状态")
- is_staff = models.BooleanField(default=True,verbose_name="是否是员工")
- date_joined = models.DateTimeField(auto_now_add=True)
-
- USERNAME_FIELD = 'username' # 使用authenticate验证时使用的验证字段,可以换成其他字段,但验证字段必须是唯一的,即设置了unique=True
- REQUIRED_FIELDS = ['email'] # 创建用户时必须填写的字段,除了该列表里的字段还包括password字段以及USERNAME_FIELD中的字段
- EMAIL_FIELD = 'email' # 发送邮件时使用的字段
-
- objects = UserManager()
-
- def get_full_name(self):
- return self.username
-
- def get_short_name(self):
- return self.username
-
- class Meta:
- verbose_name = "用户"
- verbose_name_plural = verbose_name
自定义好User模型之后还需要在settings中设置系统才会识别当前User模型作为系统默认User模型,settings中需要先安装app,然后添加AUTH_USER_MODEL=‘app.User’:
之后重新python manage.py makemigrations
,python manage.py migrate
就可以使用该模型作为系统User模型了。
还有继承AbstractBaseUser类、PermissionsMixin类自定义User模型:
不建议使用,如果使用,要重写所有的认证,form等组件和方法,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。