30Django扩展内建用户系统
原创
©著作权归作者所有:来自51CTO博客作者wx5d4124a358e8a的原创作品,请联系作者获取转载授权,否则将追究法律责任
我们自己创建用户表通常是这样的:
#这个是我们自己建的用户模型类
class User(models.Model):
username = models.CharField('手机号', max_length=11, unique=True)
password = models.CharField('密码', max_length=150)
address = models.CharFiels('常用地址',max_length=100,blank=True)
email = models.EmailField(_('email address'), blank=True)
is_superuser = models.BooleanField('是否是管理员',default=False)
is_staff = models.BooleanField('是否可以访问admin页面'default=False)
is_active = models.BooleanField('是否是有效用户'default=True)
date_joined = models.DateTimeField('用户创建的时间', default=timezone.now)
last_login = models.DateTimeField('上一次的登录时间', default=timezone.now)
Django内建用户系统官方文档:
https://docs.djangoproject.com/zh-hans/4.0/topics/auth/
模型类的位置:from django.contrib.auth.models import User
基本模型操作:
创建普通用户:
from django.contrib.auth.models import User
user=User.objects.create_user(username='zhangsan',password='123456')
创建超级用户:
from django.contrib.auth.models import User
user=User.objects.create_superuser(username='zhangsan',password='123456')
删除用户
from django.contrib.auth.models import User
try:
user = User.objects.get(username='zhangsan')
user.is_active = False #标记当前用户无效
user.save()
print('删除普通用户成功')
except:
print('伤处普通用户失败')
密码校验:
如果用户名密码校验成功则返回对应的user对象,否则返回None
from django.contrib.auth import authenticate
user=authenticate(username=username,password=password)
修改密码:
from django.contrib.auth.models import User
try:
user=User.objects.get(username='zhangsan')
user.set_password('123456')
user.save()
return HttpResponse('密码修改成功')
except:
return HttpResponse('面膜修改失败')
登录状态保持:
from django.contrib.auth import login
#伪代码
def login_view(request):
user=authenticate(username=username,password=password)
login(request,user)
登录状态校验:
例如后台管理的增删改查都是需要校验登录状态的,在云笔记中我们自己定义的校验装饰器,这里则不用
from 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_view(request):
logout(request)
内建用户字表-扩展字段:
方案1:通过建立新表,跟内建表做1对1映射(应用成本高,不推荐)
方案2:继承内建的抽象user模型类
以下三步就是要告诉Django,以后就要用我的这个表替换你系统内置的User表
步骤:
1添加新的应用
2定义模型类,继承AbstractUser
3setting.py中指明AUTH_USER_MODEL='应用名.类名'
注意:此操作要在第一个migrate之前进行
示例:
#1定义模型类
from django.db import models
from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
phone=models.CharField(max_length=11, default='')
#2在setting里配置AUTH_USER_MODEL='应用名.类名
AUTH_USER_MODEL = 'user.UserInfo'
#3执行新创建项目后的第一个migrate
python manage.py migrate
#4小试牛刀添加用户
from user.models import UserInfo
UserInfo.objects.create_user(username='zhangsan', password='123456',phone='17600588787')