擴(kuò)展django-user表
django默認(rèn)的字段對于我們的需求往往不夠用士聪,我們需要添加自己需要的字段锦援。還有就是擴(kuò)展django-user表的話還是可以用request.user來獲取到當(dāng)前用戶信息
在我們的app下的models.py文件中鍵入如下代碼來擴(kuò)展django自帶的User表:
我的app名稱是users.
# 引入django自帶User表(占坑), 以便于在下方繼承
from django.contrib.auth.models import AbstractUser
# 繼承 AbstractUser
class UserExtension(AbstractUser):
# 在下方添加所擴(kuò)展的字段
phone = models.CharField(max_length=11, blank=True, null=True, verbose_name="手機(jī)號碼")
然后在setting.py中加入:
# 'users.UserExtension' 是 ‘a(chǎn)pp名稱.剛才擴(kuò)展字段的類名’
AUTH_USER_MODEL = 'users.UserExtension'
這時(shí)你再進(jìn)行同步數(shù)據(jù)庫“颍可能會出錯(cuò)灵寺,出錯(cuò)的話建議百度活聯(lián)系我。
這時(shí)看我們數(shù)據(jù)庫里的表是這樣的区岗,你可以對照原生的django表對比一下略板。
修改django登錄的驗(yàn)證
我們在用django做登錄驗(yàn)證的時(shí)候默認(rèn)是需要username字段和password字段,現(xiàn)在我們想讓他用手機(jī)號+密碼 或者 郵箱+密碼該怎么實(shí)現(xiàn)登錄驗(yàn)證呢慈缔?
默認(rèn)登錄驗(yàn)證代碼:
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) #用戶驗(yàn)證
if user:
login(request, user) #用戶登錄
return redirect('/')
else:
return render(request, "users/login/")
從上述代碼可以看到django登陸主要是基于authenticate,如果我們想要使用手機(jī)號碼/郵箱來代替叮称,那么可以重寫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中設(shè)置如下:
我的app名稱是:users 藐鹤;重寫類名為CustomBackend瓤檐; 所以是‘users.views.CustomBackend’
AUTHENTICATION_BACKENDS =('users.views.CustomBackend',)
重寫完之后我們再進(jìn)行登錄驗(yàn)證的時(shí)候就可以這樣進(jìn)行操作了:
重寫后的驗(yàn)證方式:
def user_login(request):
phone = request.POST['phone']
password = request.POST['password']
# 實(shí)例化剛才重寫的類
authentication = CustomBackend()
user = authentication.authenticate(request, username=phone, password=password)
if user:
return HttpResponse("恭喜登錄成功")
else:
return HttpResponse("登錄失敗")
第二次更新:擴(kuò)展django_user表后的自定義注冊
修改django注冊方式
因?yàn)槲覀儗jango_user表進(jìn)行了擴(kuò)展,我們還可以繼續(xù)用django自帶的create_user方法來完成注冊娱节;
既然我們都擴(kuò)展了字段挠蛉,我們不妨來試試自己定義一下django的注冊方式;
還有一點(diǎn)原因就是用django--create_user注冊賬號的時(shí)候至少需要 username,email,password字段(可能不需要email字段記不清了)肄满;
假設(shè)我們現(xiàn)在的需求是用戶名+手機(jī)號+驗(yàn)證碼方式注冊和登陸谴古,我們該怎么實(shí)現(xiàn)呢质涛?
1.擴(kuò)展django-user 表;
2.修改注冊方法
3.修改登陸驗(yàn)證方法
1和2在上文已經(jīng)提到了掰担,我們來看看 2汇陆,修改注冊方法:
1.大家都知道,django 自帶的注冊方法會給密碼進(jìn)行一定的加密處理带饱,后期修改密碼和登陸驗(yàn)證都需要
2.擴(kuò)展后的表可以算是一張自定義的新表毡代,同樣他還有User表的功能。
請看代碼:
def zhuce(request):
# 接收到傳值
password = 123
# 像普通表一樣存儲
user = UserInfo(username='abc', phone=123)
# 調(diào)用User自帶的set_password方法對密碼進(jìn)行加密
user.set_password(password)
# 保存
user.save()
return HttpResponse('ok')
這時(shí)候的注冊和django自帶的UserInfo.objects.creat_user() 結(jié)果是一樣的勺疼,只不過我們寫的方法會比較符合我們的需求月趟,可以用自定義字段進(jìn)行注冊。
新手寫文恢口,語句啰嗦,表述不清穷躁,還請多多諒解8纭!
如有大佬覺得哪里不對问潭,還請慷慨提建議T持睢!狡忙!
本文如有哪里不清楚或有其他問題梳虽,請聯(lián)系:1441576268@qq.com 添加QQ請注明來意。
本文初次發(fā)表于:python圈(Circle)
原文鏈接:擴(kuò)展django-User表灾茁,修改(自定義)django登錄驗(yàn)證和注冊方式
轉(zhuǎn)載請注明原文地址窜觉。