写一个继承自AbstractUser的类,而后追加本身须要的字段,好比新增电话号码和年龄字段html
在settings.py加入AUTH_USER_MODEL = 'app的名字.用户类'django
class MyUser(AbstractUser): phone = models.CharField(max_length=13) age = models.IntegerField(null=True)
而后进行迁移,若以前进行过迁移会报错,须要删除迁移记录与已建立的表,从新进行迁移。app
在app的目录下新键一个文件 auth.py,写一个继承自ModeBackend的类,复写authenticate函数(根据姓名或者电话号码查找对象,而后校验密码)。函数
在settings.py里设置:AUTHENTICATION_BACKENDS=("app的名字.文件名字.类",)url
from django.contrib.auth.backends import ModelBackend from .models import MyUser class MyBackend(ModelBackend): def authenticate(self, request, username=None, password=None, **kwargs): try: user = MyUser.objects.get(username=username) except Exception: try: user = MyUser.objects.get(phone=username) except Exception: return None # 密码校验 if user.check_password(password): return user else: return None
from django.contrib.auth import authenticate, login,logout from django.contrib.auth.models import User from django.http import HttpResponse from django.shortcuts import render, redirect from django.urls import reverse def index(req): user = req.user uname = user.username if user.username else '游客' return render(req,'new_index.html',{'user_name':uname}) def mylogin(req): if req.method == 'GET': return render(req,'new_login.html') else: name = req.POST.get('name') pwd = req.POST.get('pwd') if len(name) == 0 or len(pwd) == 0: return HttpResponse('用户名密码不能为空') # 校验用户 user = authenticate(req,username = name, password = pwd) if user is None: return HttpResponse('帐号或密码错误') else: login(req,user) return redirect('/app2/index') def register(req): if req.method == 'GET': return render(req,'register.html') else: name = req.POST.get('name') pwd = req.POST.get('pwd') confirm_pwd = req.POST.get('confirm_pwd') if pwd and len(pwd) >= 4 and pwd == confirm_pwd: if not User.objects.filter(username=name).exists(): user = User.objects.create_user(username=name,password=pwd) return redirect(reverse('app2:mylogin')) else: return HttpResponse('帐号或者密码有误') def mylogout(req): logout(req) return redirect('/app2/index')