Django學習系列之重寫User模型和登錄驗證


重寫User模型

Django內置的User模型可能不適合某些項目,我們可能要基於內置的添加一些字段

創建users app

startapp users

修改settings.py配置文件,覆蓋默認的user模型

settings.py
添加以下內容
'''是app的名稱,和models里的class名稱(表名)'''
AUTH_USER_MODEL = "users.UserProfile"

編寫users app下的models.py

models.py

from django.db import models
#引用內置的user模型
from django.contrib.auth.models import  AbstractUser
# Create your models here.

#集成內置的user模型,並添加新的字段
class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50,verbose_name='昵稱',default='')
    birday = models.DateField(null=True,blank=True,verbose_name='生日')
    choice_gender = (
        ("male",""),
        ("female",""),
    )
    gender = models.CharField(choices=choice_gender,default='female',max_length=5,verbose_name='性別')
    address = models.CharField(max_length=100,default='',verbose_name='地址')
    mobile = models.CharField(max_length=11,null=True,blank=True,verbose_name='手機號')
    image = models.ImageField(upload_to='image/%Y/%m',default='image/default.png',max_length=100)


    class Meta:
        verbose_name = "用戶信息"
        verbose_name_plural = "用戶信息"


    def __unicode__(self):
        return self.username

生成數據表

makemigrtions
migrate

登錄數據庫查看

自定義登錄驗證

由於用戶表中帶email字段,想實現通過email和用戶名都能登錄,就需要重寫django authenticate(登錄驗證)方法

views.py

from django.shortcuts import render
from django.contrib.auth import  authenticate,login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q


from .models import UserProfile,EmailVerfyRecord,Banner

#重寫的authenticate登錄驗證 class CustomBackend(ModelBackend):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
            #Q方法的作用是或的意思,acc_login方法把username和password傳過來,如果以username為條件去庫里查沒查到的話,就以email為條件去庫里查(因為傳過來的username 可能是用戶名或者email)
            user = UserProfile.objects.get(Q(username=username)|Q(email=username))
            #檢測username和password是否匹配 if user.check_password(password):
                return user
        except Exception as e:
            return None


#登錄方法
def acc_login(request):
    if request.method == 'POST':
        user_name = request.POST.get('username','')
        pass_word = request.POST.get('password','')
        user = authenticate(username=user_name,password=pass_word)
        if user is not None:
            if user.is_active:
                login(request,user)
                return render(request,'index.html')
            else:
                return render(request,'login.html',{'msg':'用戶未激活'})
        else:
            return render(request, 'login.html',{'mgs':'用戶名或密碼錯誤'})
    elif request.method == 'GET':
        return render(request,'login.html')

settings.py

# AUTH 方法(支持郵箱登錄)
AUTHENTICATION_BACKENDS = ('users.views.CustomBackend',)

到此,我們就支持郵箱和用戶名登錄了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM