Django User 模块之 AbstractUser 扩展详解
最近在写博客,刚好写到用户注册注销模块,觉得这一方面还是挺有趣的。当尝试掀开Django的源代码时一切API就不会变得那么摸不着。顺着读Django的各模块源码,我们可以更灵活地更改代码以实现自己想要的功能。
现在,思考一个问题,主需求是实现博客中用户的注册登录登出功能。如果只满足于用户注册时只登记其邮箱或是用户名,Django自带的User模块既可以实现。但实际上,一个普遍的要求是注册用户应该能够修改自己的头像信息,邮箱信息,昵称信息等其他更灵活的需求。
可以先看一下DjangoUser模块的源码
classUser(AbstractUser): """ UserswithintheDjangoauthenticationsystemarerepresentedbythis model. Username,passwordandemailarerequired.Otherfieldsareoptional. """ classMeta(AbstractUser.Meta): swappable='AUTH_USER_MODEL'
注意:如果你的是Anaconda管理,可以在路径C:\Users\User\Anaconda3\Lib\site-packages\django\contrib\auth\models.py查看
Django中的User模块实际上继承了AbstractUser模块,AbstractUser模块下有:
username
first_name
last_name
email
date_joined
…
你可以看出,User模块继承了AbstractUser抽象基类,而仅仅只是继承了,并没有对AbstractUser进行任何扩展。所以,对于一个需要更多需求的User模块信息来说,我们可以继承AbstractUser并根据自己的需求进行扩展。
现在,我们对用户属性添加一些需求,比如支持用户修改头像、支持用户昵称、qq、wechat以及网站链接等。
classUser(AbstractUser): nickname=models.CharField(max_length=30,blank=True,null=True,verbose_name='昵称') qq=models.CharField(max_length=20,blank=True,null=True,verbose_name='QQ号码') url=models.URLField(max_length=100,blank=True,null=True,verbose_name='个人网页地址') avatar=ProcessedImageField(upload_to='avatar', default='avatar/default.png',verbose_name='头像') classMeta: verbose_name='用户' verbose_name_plural=verbose_name ordering=['-id'] def__str__(self): returnself.username
我们给自定义的用户模块增加nickname(昵称),qq,url(网站链接),avatar(头像)属性。
注意:为了让Django能够识别使用自定义的用户模型,必须要在settings.py中设置自定义模块位置,如在settings.py上添加
AUTH_USER_MODEL='blog.user'
其中,blog为你对应的应用app信息,user为blog应用下的user模块,在这里blog和user大小写无关。
如果在你现在执行数据库迁移命令,可能会出现blog不存在user模块的提示,而无法重新进行数据迁移。
ValueError:Thefieldaccount.EmailAddress.userwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'. Thefieldadmin.LogEntry.userwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'. Thefieldblog.Article.authorwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'. Thefieldeasy_comment.Comment.userwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'. Thefieldeasy_comment.Like.userwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'. Thefieldnotifications.Notification.recipientwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'. Thefieldonline_status.OnlineStatus.userwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'. Thefieldsocialaccount.SocialAccount.userwasdeclaredwithalazyreferenceto'blog.user',butapp'blog'doesn'tprovidemodel'user'.
所以,如果之前是使用例如AUTH_USER_MODEL=auth.user的用户模型,并重新将其自定义为AUTH_USER_MODEL=blog.user请删掉migrations目录下的所有文件以及数据库文件。
删除之后,重新进行数据库的迁移
$pythonmanage.pymakemigrationsmyapp $pythonmanage.pymigrate
这个时候,所使用的用户即为自定义后的用户了。
File"C:\Users\Micky\Anaconda3\lib\site-packages\django\db\backends\utils.py",line85,in_execute returnself.cursor.execute(sql,params) File"C:\Users\Micky\Anaconda3\lib\site-packages\django\db\backends\sqlite3\base.py",line303,inexecute returnDatabase.Cursor.execute(self,query,params) django.db.utils.OperationalError:nosuchtable:blog_user
这里可以在模板中指定数据库db_table='user'
补充知识:Django学习笔记——内置用户类AbstractUser与内置认证校验系统
内置用户类AbstractUser
我们在之前讲过了model模型的作用和父类的作用,这次介绍的内置用户类AbstractUser就是Django内置的一个关于用户操作的类,它极大地方便了我们对model模型中对User用户类的设计。而所谓内置用户类的本质也就是一个封装好的父类,所以使用起来是相当的方便。
#导入AbstractUser类 fromdjango.contrib.auth.modelsimportAbstractUser #直接继承就可以了,如果有需要就向寻常model一样写字段就可以 classUser(AbstractUser): pass
我们通过查看AbstractUser的源码可以知道它设有几个字段
#用户名 username=models.CharField( _('username'), max_length=150, unique=True, help_text=_('Required.150charactersorfewer.Letters,digitsand@/./+/-/_only.'), validators=[username_validator], error_messages={ 'unique':_("Auserwiththatusernamealreadyexists."), }, ) #名 first_name=models.CharField(_('firstname'),max_length=30,blank=True) #姓 last_name=models.CharField(_('lastname'),max_length=150,blank=True) #邮箱 email=models.EmailField(_('emailaddress'),blank=True) #权限 is_staff=models.BooleanField( _('staffstatus'), default=False, help_text=_('Designateswhethertheusercanlogintothisadminsite.'), ) #激活 is_active=models.BooleanField( _('active'), default=True, help_text=_( 'Designateswhetherthisusershouldbetreatedasactive.' 'Unselectthisinsteadofdeletingaccounts.' ), ) #日期 date_joined=models.DateTimeField(_('datejoined'),default=timezone.now)
内置认证校验系统
django自带的用户认证校验系统较为简单,主要就是认证用户名密码的正确与否
首先要在settings里面配置
#使用自带的认证系统
AUTH_USER_MODEL="user.User"
这是配合自带的用户类AbstractUser一起使用的
通常使用在类视图中的post方法校验用户登录等操作
在view中的具体代码如下
classLoginView(View): defget(self,request): #逻辑代码 returnrender(request,'login.html') defpost(self,request): #获取前端传递过来的用户名和密码 username=request.POST.get('username') pwd=request.POST.get('pwd') record=request.POST.get('record') #进行数据校验 ifnotall([username,pwd]): returnHttpResponse('数据输入不完整') #验证用户名和密码是否正确 user=authenticate(username=username,password=pwd) returnrender(request,''index.html')
主要就是其中的user=authenticate(username=username,password=pwd)
两个参数都是拿到前端用户输入的信息
以上这篇DjangoUser模块之AbstractUser扩展详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。