扩展django-user表
django默认的字段对于我们的需求往往不够用,我们需要添加自己需要的字段。还有就是扩展django-user表的话还是可以用request.user来获取到当前用户信息
在我们的app下的models.py文件中键入如下代码来扩展django自带的User表:
我的app名称是users.
# 引入django自带User表(占坑), 以便于在下方继承
from django.contrib.auth.models import AbstractUser
# 继承 AbstractUser
class UserExtension(AbstractUser):
# 在下方添加所扩展的字段
phone = models.CharField(max_length=11, blank=True, null=True, verbose_name="手机号码")
然后在setting.py中加入:
# 'users.UserExtension' 是 ‘app名称.刚才扩展字段的类名’
AUTH_USER_MODEL = 'users.UserExtension'
这时你再进行同步数据库。可能会出错,出错的话建议百度活联系我。
这时看我们数据库里的表是这样的,你可以对照原生的django表对比一下。
修改django登录的验证
我们在用django做登录验证的时候默认是需要username字段和password字段,现在我们想让他用手机号+密码 或者 邮箱+密码该怎么实现登录验证呢?
默认登录验证代码:
from django.views import View
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
def login(request):
username = 123
password = 123
user = authenticate(username=username, password=password) #用户验证
if user:
login(request, user) #用户登录
return redirect('/')
else:
return render(request, "users/login/")
从上述代码可以看到django登陆主要是基于authenticate,如果我们想要使用手机号码/邮箱来代替,那么可以重写authenticate();
重写authenticate:
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import UserExtension
class CustomBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
try:
user = UserExtension.objects.get(Q(username=username) | Q(phone=username))
if user.check_password(password):
return user
except Exception as e:
return None
然后在setting.py中设置如下:
我的app名称是:users ;重写类名为CustomBackend; 所以是‘users.views.CustomBackend’
AUTHENTICATION_BACKENDS =('users.views.CustomBackend',)
重写完之后我们再进行登录验证的时候就可以这样进行操作了:
重写后的验证方式:
def user_login(request):
phone = request.POST['phone']
password = request.POST['password']
# 实例化刚才重写的类
authentication = CustomBackend()
user = authentication.authenticate(request, username=phone, password=password)
if user:
return HttpResponse("恭喜登录成功")
else:
return HttpResponse("登录失败")
第二次更新:扩展django_user表后的自定义注册
修改django注册方式
因为我们对django_user表进行了扩展,我们还可以继续用django自带的create_user方法来完成注册;
既然我们都扩展了字段,我们不妨来试试自己定义一下django的注册方式;
还有一点原因就是用django--create_user注册账号的时候至少需要 username,email,password字段(可能不需要email字段记不清了);
假设我们现在的需求是用户名+手机号+验证码方式注册和登陆,我们该怎么实现呢?
1.扩展django-user 表;
2.修改注册方法
3.修改登陆验证方法
1和2在上文已经提到了,我们来看看 2,修改注册方法:
1.大家都知道,django 自带的注册方法会给密码进行一定的加密处理,后期修改密码和登陆验证都需要
2.扩展后的表可以算是一张自定义的新表,同样他还有User表的功能。
请看代码:
def zhuce(request):
# 接收到传值
password = 123
# 像普通表一样存储
user = UserInfo(username='abc', phone=123)
# 调用User自带的set_password方法对密码进行加密
user.set_password(password)
# 保存
user.save()
return HttpResponse('ok')
这时候的注册和django自带的UserInfo.objects.creat_user() 结果是一样的,只不过我们写的方法会比较符合我们的需求,可以用自定义字段进行注册。
新手写文,语句啰嗦,表述不清,还请多多谅解!!
如有大佬觉得哪里不对,还请慷慨提建议!!!
本文如有哪里不清楚或有其他问题,请联系:[email protected] 添加QQ请注明来意。
本文初次发表于:python圈(Circle)
原文链接:扩展django-User表,修改(自定义)django登录验证和注册方式
转载请注明原文地址。