Spbeen——Python技术栈大数据 爬虫Python AI Sql

【编号0007】Django2中的三种User拓展方式

2019-08-07  本文已影响0人  布拉豆

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

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

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

Django自带的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字段组成的时候,有介绍到:

那有没有方法,直接替换掉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,则自带的字段就变成了入下内容:

在这里你还可以选择不继承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) # 登录账户

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


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


!放在最后

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

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

wxgzh1.png
上一篇 下一篇

猜你喜欢

热点阅读