重寫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',)
到此,我們就支持郵箱和用戶名登錄了