# 通常已自带
# INSTALLED_APPS 安装应用
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
# MIDDLEWARE 中间件配置
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
# 数据库迁移命令
# 自己在命令行中执行:
python manage.py makemigrations
python manage.py migrate
序号 | 字段 | 说明 |
---|---|---|
1 | username | 用户名 |
2 | password | 登录密码 |
3 | 邮箱 | |
4 | first_name | 名 |
5 | last_name | 姓 |
6 | is_superuser | 是否是超级管理员账号/admin |
7 | is_staff | 是否可以访问admin管理后台 |
8 | is_active | 是否是活跃用户,默认为True,一般不删除,而是将用用户的is_active设置为False |
9 | is_authenticated | 用户是否已登录的只读属性 |
10 | is_anonymous | 用户是否登录失效的只读属性 |
11 | date_joined | 用户创建的时间 |
12 | last_login | 上一次登录时间 |
13 | groups | 用户组多对多关系 |
14 | user_permission | 用户权限多对多关系 |
官网参考地址:https://docs.djangoproject.com/zh-hans/3.2/topics/auth/default/#user-objects
from django.contrib.auth.models import User
# 只有usename是必填项,其余可不填
# 创建密码为明文密码的普通用户
User.objects.create(username="AA",password="123")
# 创建密码为通过Django内部自动加密的密码的普通用户
User.objects.create_user(username="AA",password="123")
from django.contrib.auth.models import User
# 只有usename是必填项,其余可不填
User.objects.create_superuser(username="AA",password="123")
建议使用:伪删除,即将is_active修改为False
from django.contrib.auth.models import User
try:
user = User.objects.get(username = "用户名")
user.is_ active = False
user.save()
print("删除用户成功")
except:
print("删除用户失败,或该用户不存在")
注意: 不可用update来更新,User不能用。
user = User.objects.get(username = "用户名")
user.update(is_active=True)
"""
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'User' object has no attribute 'update'
"""
>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()
from django.contrib.auth.models import User
try:
user = User.objects.get(username="用户名")
user.set_password("明文密码")
user.save()
return HttpResponse("修改密码成功")
except:
return HttpResponse("修改密码失败")
u = User.objects.get(username='aa')
u.check_password('my password')
from django.contrib.auth import authenticate
user = authenticate(username = username,password=password)
说明: 若用户名密码校验成功则返回对应的user对象,否则返回None。
from django.contrib.auth import authenticate
user = authenticate(username="AA",password="123")
# 正确输出
user
<User: AA>
from django.contrib.auth import login
from django.contrib.auth import authenticate
def login_view(request):
...
# 先校验
user = authenticate(username="用户名",password="密码")
...
# 检验成功则保持登录状态
login(request,user) # 若用户通过检验,则可以调用此来保持登录状态
注: 保存的方式为session,且时间不可以控制,当session什么时候过期,那么就什么时候断开。
同前,用django自带登录状态校验装饰器,实现登录状态的校验。哪个视图需要,就放在哪个视图之前。
import django.contrib.auth.decorators import login_required
@login_required # 通过登录则返回下面视图,否则跳转至登录页面
def index_view(request):
# 该视图必须为用户登录状态下才能访问
# 当前登录用户通过request.user获取
login_user = request.user
...
from django.contrib.auth import logout
def logout(request):
logout(request)
# 请求传过来,然后将session清空,从而取消登录
# 用户模型
from django.contrib.auth.models import User
# 登录状态检验的装饰器
from django.contrib.auth.decorators import login_required
# 记录登录状态、退出登录状态、登录用户信息的校验
from django.contrib.auth import login,logout,authenticate
def reg_view(request):
# 注册
if request.method == "GET":
return render(request,"reg_view")
elif request.method == 'POST':
username = request.POST.get("user")
pwd1 = request.POST.get("pwd1")
pwd2 = request.POST.get("pwd2")
if not User.objects.filter(uesename=username):
if pwd1 == pwd2:
# 这里可以try一下,因为用户名唯一性,可能会出现SQL唯一性异常报错
user = User.objects.create_user(username=username,password=pwd1)
else:
return HttpResponse("密码不一致,请重新输入")
else:
return HttpResponse("该用户名已注册,请重新输入")
# # 实现用户注册后免登录
# login(request,user)
# return HttpResponseRedirect("/index")
return HttpResponseRedirect("/login")
def login(request):
if request.method == "GET":
return render(request,"login.html")
elif request.method == "POST":
username = request.POST.get("username")
password = request.POST.get("password")
user = authenticate(username=username,password=password)
if not user:
# 用户名或密码错误
return HttpResponse("用户名或密码错误")
else:
# 校验成功
# 记录会话登录状态
login(request,user)
return HttpResponseRedirect("/index")
def logout(request):
logout(request)
return HttpResponseRedirect("/login")
# 需要登录状态检验才能访问的页面
@login_required()
def index_view(request):
# 首页,必须登录才能访问,未登录跳转至settings.LOGIN_URL设置
# 获取当前登录用户名
user = request.user
return render(request,"index.html")
当我们要使用如手机号字段时,发现用户字段不够用,这时就需要想办法来增加字段。
User
模型类
Django
将原User
模型类替换为SelfUser
模型类继承内建抽象类: 后台管理密码修改问题解决方案
AbstractUser
# 所在位置:appname/models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class UserInfo(AbstractUser):
# 在原有的基础上,添加一个手机号字段
phone = models.CharField(max_length=11,default="")
settings.py
中指明AUTH_USER_MODDEL="应用名.类名"
# 所在位置 mysite_name/settings.py
AUTH_USER_MODEL = 'appname.UserInfo'
注意: 此流程最好要在第一次migrate
时执行,否则用方案1合适。后面一切调用模型类时就应该是UserInfo这个模型类了。
–添加新用户–
from user.models import UserInfo
user = UserInfo(username="XX",password="xxxx",phone="xxxxxxxx")