powerdesigner中是否必输是哪一个字段_【编号0007】Django2中的三种User拓展方式

15e1dd050555b5192511184dec993e1f.png

时隔7天,我又来发布文章了,前面那段时间去哪了呢?当然是开发去了

一时开发一时爽,一直开发一直爽

所以本篇文章,是关于Django2版本的User字段拓展,一篇实用型文档

Django自带的User模型,仅有如下字段:

  • username【来自AbstractUser】账号
  • first_name 【来自AbstractUser】
  • last_name【来自AbstractUser】
  • email 【来自AbstractUser】邮箱
  • is_staff 【来自AbstractUser】是否能进入admin后台
  • is_active 【来自AbstractBaseUser】是否可用
  • data_joined【来自AbstractUser】注册时间
  • last_login【来自AbstractBaseUser】最后登录时间
  • password【来自AbstractBaseUser】密码
  • is_superuser【来自PermissionsMixin】是否是超级管理员
  • groups【来自PermissionsMixin】用户所在组
  • user_permissions【来自PermissionsMixin】用户权限

以上是全部的字段信息,当然每个都注明了来源

什么是来源?

答:

  • User是Django自带的用户模型,它是直接继承的AbstractUser类,自身没有定义任何的字段;
  • 而且AbstractUser虽然自己定义了部分字段,同时也继承了AbstractBaseUser, PermissionsMixin这两个类的,所以User的后半部分字段,来自于这俩个类。
  • 所以User的字段,由这三个类提供。

那拓展的第一个思路来了,撇开Django自带的User,直接从继承AbstractUser,并定义自己需要的字段,就可以了。

第一种方案:继承AbstractUser

# 已注册的app,app名是book,该文件是models.py
from django.contrib.auth.models import AbstractUser
​
class User(AbstractUser):
​
    nickname = models.CharField(max_length=100, verbose_name="昵称", null=True, default=None, blank=True)
    phone = models.CharField(max_length=16, verbose_name="手机号")
    address = models.CharField(max_length=80, null=True, default=None, verbose_name="地址",blank=True)

这是继承和重写的方法,那写完就可以了吗?

当然不是,还得在配置文件里面,说明一下,也就是settings.py,如下:

AUTH_USER_MODEL='book.User'

AUTH_USER_MODEL 是固定的,后面的值,是app名.Model类名

到这里就注册好了,这里就是自行注册AUTH_USER_MODEL 替换掉Django内置的User

Tips:此方法,Django1和2通用

第二种方案:继承AbstractBaseUser

在介绍User字段组成的时候,有介绍到:

  • User继承AbstractUser,且没有定义任何的字段;
  • AbstractUser继承AbstractBaseUser, PermissionsMixin,且定义了自己的字段,其中first_name和last_name就是AbstractUser定义的

那有没有方法,直接替换掉AbstractUser这个类?说实话,first_name和last_name瞅着挺烦的,能去掉是最好了;

当然可以了,如下操作:

class User(AbstractBaseUser,PermissionsMixin):
    username = models.CharField(max_length=100, verbose_name="账号", null=True, default=None, blank=True)
    nickname = models.CharField(max_length=100, verbose_name="昵称", null=True, default=None, blank=True)
    phone = models.CharField(max_length=16, verbose_name="手机号")
    address = models.CharField(max_length=80, null=True, default=None, verbose_name="地址",blank=True)

当然,选择继承AbstractBaseUser,就要注意,采取这个方案,在User中来自AbstractUser的字段,全部不存在,需要的你要自己写

如果是不继承AbstractUser,则自带的字段就变成了入下内容:

  • is_active 【来自AbstractBaseUser】是否可用
  • last_login【来自AbstractBaseUser】最后登录时间
  • password【来自AbstractBaseUser】密码
  • is_superuser【来自PermissionsMixin】是否是超级管理员
  • groups【来自PermissionsMixin】用户所在组
  • user_permissions【来自PermissionsMixin】用户权限

在这里你还可以选择不继承PermissionsMixin,这样又少了三个字段。

这个方案同样需要配置settings.py的代码,一样,就这个:

AUTH_USER_MODEL='book.User'

第三种方案:拓展User

这种方法最简单,相对而已,一点都不优雅。

直接介绍吧,反正我不喜欢它,如下:

class Profile(models.Model):
    belong_to = models.OneToOne(to=User,related_name="profile",verbose_name="属于")
    nickname = models.CharField(max_length=100, verbose_name="昵称", null=True, default=None, blank=True)
    phone = models.CharField(max_length=16, verbose_name="手机号")
    address = models.CharField(max_length=80, null=True, default=None, verbose_name="地址",blank=True)

直接定义一个简单的类,然后指定一个“一对一”的字段,绑定到User,这样就得到了专属User的一个个人信息拓展模型

简单暴力,不修改任何的源码,所以也不太推荐

总结:怎么方便怎么来

具体怎么用,就看你在项目中的具体岗位,和你有多少时间去完成这个功能

最后:使用邮箱|手机号|账户【三选一】+密码登录

现在的网站,每个账号都有账户名、手机号、邮箱这三者内容,所以在登录时,任意一个,外加一个密码就可以验证身份,实现登录,那在Ddjango的View中,写怎么样的逻辑代码方便呢?

千万不要使用if...elif...elif...else做判断,难看,且代码有点多。

推荐使用Django模型的查询语法,一行查询语句,获得当前是否有账户,如下:

# username是前端传过来的值,可以是邮箱、手机号、账户名
username = request.POST.get('username') 
password = request.POST.get('password')
user = User.objects.filter(Q(username=username) | Q(email=username)| Q(mobile=username) ).first()
# if判断,user存在,且密码检测正确
if user and user.check_password(password):
    login(request,user) # 登录账户

这个代码,就是账户查询和密码检测的全部内容了,不长,且好懂


以上就是本篇文章的全部介绍内容了


!放在最后

如果文章中有什么错误或者建议修改的地方,欢迎留言纠正和回复

如果你喜欢本篇文章,不妨关注一下我们的公众号,每周更新两篇原创技术文档,都是干货

580e1537ab857fcc717b0b0141071dc0.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值