Django如何继承AbstractUser扩展字段
使用django实现注册登录的话,注册登录都有现成的代码,主要是自带的User字段只有(email,username,password),所以需要扩展User,来增加自己需要的字段
AbstractUser扩展模型User:如果模型User内置的方法符合开发需求,在不改变这些函数方法的情况下,添加模型User的额外字段,可通过AbstractUser方式实现。使用AbstractUser定义的模型会替换原有模型User。
代码如下:
model.py
#coding:utf8 fromdjango.dbimportmodels fromdjango.contrib.auth.modelsimportAbstractUser fromdjango.utils.encodingimportpython_2_unicode_compatible #Createyourmodelshere. @python_2_unicode_compatible """是django内置的兼容python2和python3的unicode语法的一个装饰器 只是针对__str__方法而用的,__str__方法是为了后台管理(admin)和djangoshell的显示,Meta类也是为后台显示服务的 """ classMyUser(AbstractUser): qq=models.CharField(u'qq号',max_length=16) weChat=models.CharField(u'微信账号',max_length=100) mobile=models.CharField(u'手机号',primary_key=True,max_length=11) identicard=models.BooleanField(u'×××认证',default=False)#默认是0,未认证,1:×××认证,2:视频认证 refuserid=models.CharField(u'推荐人ID',max_length=20) Level=models.CharField(u'用户等级',default='0',max_length=2)#默认是0,用户等级0-9 vevideo=models.BooleanField(u'视频认证',default=False)#默认是0,未认证。1:已认证 Type=models.CharField(u'用户类型',default='0',max_length=1)#默认是0,未认证,1:刷手2:商家 def__str__(self): returnself.username
settings.py
AUTH_USER_MODEL='appname.MyUser'
AUTHENTICATION_BACKENDS=('django.contrib.auth.backends.ModelBackend',)
注意:
1、扩展user表后,要在settings.py添加
AUTH_USER_MODEL='appname.扩展user的classname'
2、认证后台要在settings添加,尤其记得加逗号,否则报错
认证后台不加的报错
Django-AttributeError'User'objecthasnoattribute'backend'
没加逗号的报错
ImportError:adoesn'tlooklikeamodulepath
form.py
#coding:utf-8 fromdjangoimportforms #注册表单 classRegisterForm(forms.Form): username=forms.CharField(label='用户名',max_length=100) password=forms.CharField(label='密码',widget=forms.PasswordInput()) password2=forms.CharField(label='确认密码',widget=forms.PasswordInput()) mobile=forms.CharField(label='手机号',max_length=11) email=forms.EmailField() qq=forms.CharField(label='QQ号',max_length=16) type=forms.ChoiceField(label='注册类型',choices=(('buyer','买家'),('saler','商家'))) defclean(self): ifnotself.is_valid(): raiseforms.ValidationError('所有项都为必填项') elifself.cleaned_data['password2']!=self.cleaned_data['password']: raiseforms.ValidationError('两次输入密码不一致') else: cleaned_data=super(RegisterForm,self).clean() returncleaned_data #登陆表单 classLoginForm(forms.Form): username=forms.CharField(label='用户名',widget=forms.TextInput(attrs={"placeholder":"用户名","required":"required",}), max_length=50,error_messages={"required":"username不能为空",}) password=forms.CharField(label='密码',widget=forms.PasswordInput(attrs={"placeholder":"密码","required":"required",}), max_length=20,error_messages={"required":"password不能为空",})
迁移数据库
pythonmanage.pymakemigrations
pythonmanage.pymigrate
views.py
fromdjango.shortcutsimportrender,render_to_response from.modelsimportMyUser fromdjango.httpimportHttpResponse,HttpResponseRedirect fromdjango.templateimportRequestContext importtime from.myclassimportform fromdjango.templateimportRequestContext fromdjango.contrib.authimportauthenticate,login,logout #注册 defregister(request): error=[] #ifrequest.method=='GET': #returnrender_to_response('register.html',{'uf':uf}) ifrequest.method=='POST': uf=form.RegisterForm(request.POST) ifuf.is_valid(): username=uf.cleaned_data['username'] password=uf.cleaned_data['password'] password2=uf.cleaned_data['password2'] qq=uf.cleaned_data['qq'] email=uf.cleaned_data['email'] mobile=uf.cleaned_data['mobile'] type=uf.cleaned_data['type'] ifnotMyUser.objects.all().filter(username=username): user=MyUser() user.username=username user.set_password(password) user.qq=qq user.email=email user.mobile=mobile user.type=type user.save() returnrender_to_response('member.html',{'username':username}) else: uf=form.RegisterForm() returnrender_to_response('register.html',{'uf':uf,'error':error}) #登陆 defdo_login(request): ifrequest.method=='POST': lf=form.LoginForm(request.POST) iflf.is_valid(): username=lf.cleaned_data['username'] password=lf.cleaned_data['password'] user=authenticate(username=username,password=password)#django自带auth验证用户名密码 ifuserisnotNone:#判断用户是否存在 ifuser.is_active:#判断用户是否激活 login(request,user)#用户信息验证成功后把登陆信息写入session returnrender_to_response("member.html",{'username':username}) else: returnrender_to_response('disable.html',{'username':username}) else: returnHttpResponse("无效的用户名或者密码!!!") else: lf=form.LoginForm() returnrender_to_response('index.html',{'lf':lf}) #退出 defdo_logout(request): logout(request) returnHttpResponseRedirect('/')
注意:
1、登陆的时候用自带的认证模块总是报none
user=authenticate(username=username,password=password)
print(user)
查看源码发现是check_password的方法是用hash进行校验,之前注册的password写法是
user.password=password
这种写法是明文入库,需要更改密码的入库写法
user.set_password(password)
补充
一个快速拿到User表的方法,特别在扩展User表时,你在settings.py配置的User。
fromdjango.contrib.authimportget_user_model
User=get_user_model()
别在其他视图或者模型里导入你扩展的MyUsermodel。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。