当前位置:   article > 正文

django扩展user表 ,以及换成手机号验证,详解AbstractUser_自定义手机号码路由转换器验证手机号码django

自定义手机号码路由转换器验证手机号码django

扩展User模型

不建议直接继承user表,user表本身无一句代码,直接继承的AbstractUser

扩展方法一:

使用外键关联,同时可以用信号道 让2个表自动同步

可以通过创建另外一张表去关联User表,从而添加额外字段,并且我们可以写一个接受保存模型的信号处理方法,只要User调用了save方法,那么关联表就会自动添加一条数据与User新添加的用户进行绑定:

  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. from django.dispatch import receiver # 导入receiver监听信号
  4. from django.db.models.signals import post_save # 导入post_save信号
  5. class ExtensionUser(object):
  6. """创建一对一模型,并添加新的字段"""
  7. user = models.OneToOneField(User,on_delete=models.CASCADE)
  8. telephone = models.CharField(max_length=11,verbose_name="手机号码")
  9. @receiver(post_save,sender=User) # 监听到post_save事件且发送者是User则执行create_extension_user函数
  10. def create_extension_user(sender,instance,created,**kwargs):
  11. """
  12. sender:发送者
  13. instance:save对象
  14. created:是否是创建数据
  15. """
  16. if created:
  17. # 如果创建对象,ExtensionUser进行绑定
  18. ExtensionUser.objects.create(user=instance)
  19. else:
  20. # 如果不是创建对象,同样将改变进行保存
  21. instance.extension.save()

信号道特征像是一个事件处理,具体用 法可以百度

继承AbstractUser自定义模型:
Django自带的User模型就是继承的AbstractUser类,因此我们可以通过继承AbractUser类自定义User模型:

  1. from django.contrib.auth.models import BaseUserManager,AbstractUser
  2. from shortuuidfield import ShortUUIDField # 使用shortuuid作为User表的主键,使数据更加的安全
  3. class UserManager(BaseUserManager): #自定义Manager管理器
  4. def _create_user(self,username,password,email,**kwargs):
  5. if not username:
  6. raise ValueError("请传入用户名!")
  7. if not password:
  8. raise ValueError("请传入密码!")
  9. if not email:
  10. raise ValueError("请传入邮箱地址!")
  11. user = self.model(username=username,email=email,**kwargs)
  12. user.set_password(password)
  13. user.save()
  14. return user
  15. def create_user(self,username,password,email,**kwargs): # 创建普通用户
  16. kwargs['is_superuser'] = False
  17. return self._create_user(username,password,email,**kwargs)
  18. def create_superuser(self,username,password,email,**kwargs): # 创建超级用户
  19. kwargs['is_superuser'] = True
  20. kwargs['is_staff'] = True
  21. return self._create_user(username,password,email,**kwargs)
  22. class User(AbstractUser): # 自定义User
  23. GENDER_TYPE = (
  24. ("1","男"),
  25. ("2","女")
  26. )
  27. uid = ShortUUIDField(primary_key=True)
  28. username = models.CharField(max_length=15,verbose_name="用户名",unique=True)
  29. nickname = models.CharField(max_length=13,verbose_name="昵称",null=True,blank=True)
  30. age = models.IntegerField(verbose_name="年龄",null=True,blank=True)
  31. gender = models.CharField(max_length=2,choices=GENDER_TYPE,verbose_name="性别",null=True,blank=True)
  32. phone = models.CharField(max_length=11,null=True,blank=True,verbose_name="手机号码")
  33. email = models.EmailField(verbose_name="邮箱")
  34. picture = models.ImageField(upload_to="Store/user_picture",verbose_name="用户头像",null=True,blank=True)
  35. home_address = models.CharField(max_length=100,null=True,blank=True,verbose_name="地址")
  36. card_id = models.CharField(max_length=30,verbose_name="身份证",null=True,blank=True)
  37. is_active = models.BooleanField(default=True,verbose_name="激活状态")
  38. is_staff = models.BooleanField(default=True,verbose_name="是否是员工")
  39. date_joined = models.DateTimeField(auto_now_add=True)
  40. USERNAME_FIELD = 'username' # 使用authenticate验证时使用的验证字段,可以换成其他字段,但验证字段必须是唯一的,即设置了unique=True
  41. REQUIRED_FIELDS = ['email'] # 创建用户时必须填写的字段,除了该列表里的字段还包括password字段以及USERNAME_FIELD中的字段
  42. EMAIL_FIELD = 'email' # 发送邮件时使用的字段
  43. objects = UserManager()
  44. def get_full_name(self):
  45. return self.username
  46. def get_short_name(self):
  47. return self.username
  48. class Meta:
  49. verbose_name = "用户"
  50. 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等组件和方法,

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/306496
推荐阅读
相关标签
  

闽ICP备14008679号