首先构建我们的用户体系
在models里继承AbstractUser
from django.contrib.auth.models import AbstractUser
from django.db import models
import random
# Create your models here.
# 构建我们的用户
class MyUser(AbstractUser):
phone = models.CharField(
max_length=20,
verbose_name="手机号",
unique=True
)
icon = models.ImageField(
upload_to='icons',
null=True
)
在settings.py中设置
AUTH_USER_MODEL = "APP名.类名(MyUser)"
注意:记得执行迁移 如迁移失败,则删除数据库里所有的表重新执行迁移!!!
迁移成功后可以在数据库中看到
可以看到自己定义的字段,表示继承没问题。
自定义登录
首先新建一个做登录认证的.py文件
from django.contrib.auth.backends import ModelBackend
# 导入自己的用户类
from .models import MyUser
class MyBackend(ModelBackend):
# 复写authenticate
def authenticate(self, request, username=None, password=None, **kwargs):
# 思路 1.先找用户 2.在做验证密码
# 找人
user = None
try:
user = MyUser.objects.get(username=username)
except:
try:
user = MyUser.objects.get(phone=username)
except:
return None
# 做密码验证
if user.check_password(password):
return user
else:
return None
修改settings.py文件
# 指定认证的类
AUTHENTICATION_BACKENDS = (
'你APP的名字.文件名.MyBackend(认证类名)',
)
再在views写逻辑
def my_login(req):
if req.method == 'GET':
return render(req, 'login.html')
else:
params = req.POST
u_name = params.get('u_name')
pwd = params.get('pwd')
# 数据校验
# 用户校验
user = authenticate(username=u_name, password=pwd)
if user:
# 用户登录
login(req, user)
# 登录成功返回页面
return redirect('/dj05app/my_index')
else:
return HttpResponse("用户名或者密码错误")
前端登录代码如下
<form action="{% url 'dj05app:my_login' %}" method="post" style="text-align: center">
{% csrf_token %}
<input type="text" name="u_name" placeholder="用户名或手机号">
<br>
<input type="password" name="pwd" placeholder="密码">
<br>
<input type="submit" value="登录">
登录后的页面跳转(前端)
欢迎{{ u_name }}
登录后的页面跳转(后端)
@login_required(login_url="/dj05app/my_login")
def my_index(req):
user = req.user
return render(req, 'index.html', {"u_name": user.username})
注意:
@login_required()
作用:保证一个API在用户调用时,保证用户是登录状态
login_url 参数 指定的值是我们自己的登录页面的url
就是指 如果没有用户,则会跳转到登录页面
由于我们是直接用的登录,所有用户信息是在后台添加的
添加用户名和密码
添加手机号