时隔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) # 登录账户
这个代码,就是账户查询和密码检测的全部内容了,不长,且好懂
以上就是本篇文章的全部介绍内容了
!放在最后
如果文章中有什么错误或者建议修改的地方,欢迎留言纠正和回复
如果你喜欢本篇文章,不妨关注一下我们的公众号,每周更新两篇原创技术文档,都是干货