注意事项:
AUTH_USER_MODEL = 'app01.UserInfo' (先到settings.py配置文件中配置)
AUTH_USER_MODEL = '应用名.用户表名'
如果不配置,就无法正常使用
"""
在models表写好之后,运行数据库迁移命令(makemigrations migrate)
数据库中会自动生成很多表,auth_user表,这个表可以进行扩展,在下面会写
所以
AUTH_USER_MODEL = 'app01.UserInfo'
这里的的用户表名,可以写自己扩展的用户表名,其实它就是auth_user
"""
常用方法总结
from django.contrib import auth
1 '比对账号和密码是否正确'
if request.method == 'POST':
username = request.POST.get('username')
password = request.POST.get('password')
# 去用户表中校验数据
# 1 表如何获取
* 2 '密码如何比对'
user_obj = auth.authenticate(request, username=username, password=password)
# 括号内必须同时传入用户名和密码
# print(user_obj) # 用户对象,
# print(user_obj.username) # 用户名
# print(user_obj.password) # 密文密码
····························
2 '保存用户状态'
if user_obj:
# 保存用户状态
auth.login(request, user_obj) # 类似于 request.session[key] = user_obj
# 只要执行了该方法,就可以在任何地方通过request.user 获取到当前登录的用户对象
return redirect('/home.html/')
···························
3 '判断当前用户是否登录'
request.user.is_authenticated() # 返回False/True
is_authenticated() 方法是用来判断用户是否已经登录(是否认证通过)的方法。当你需要在代码中进行布尔判断时,不需要加括号,直接使用这个方法即可。
if request.user.is_authenticated:
# 用户已登录,执行相应操作
else:
# 用户未登录,执行其他操作
在这个示例中,is_authenticated 后面没有加括号,因为它本身就是一个属性,表示一个布尔值,用于判断用户是否已经登录。
····························
4 '获取当前登录用户'
request.user
····························
5 '比对原密码'
# 校验老密码对不对
is_right = request.user.check_password(old_password) # 修改密码前先比对
····························
6 '修改密码(两步)'
request.user.set_password(new_password) # 仅修改对象的属性,不写入数据库
request.user.save() # 这一步是真正的操作数据库
····························
7 '注销'
auth.logout(request) #将当前登录的用户退出登录
····························
8 '注册'
from django.contrib.auth.models import User # 操作user表 要导入这个
# 1 操作auth_user表,写入数据(这种方法,密码不会自动加密)
User.objects.create(username=username,password=password)
# 2 创建普通用户
User.objects.create_user(username=username,password=password)
# 3 创建超级用户(了解):使用代码创建超级用户,邮箱是必填的,命令行创建可以不填
User.objects.create_superuser(username=username,email='[email protected]',password=password)
Auth模块验证登录状态的装饰器
'给方法添加登录才可以用的装饰器'
from django.contrib.auth.decorators import login_required
# 局部配置 没有登录就跳到指定页面
@login_required(login_url='/login/')
# 全局配置
LOGIN_URL = '/login/' # 写在sttions中
@login_required # 写在方法名上
1 当装饰器局部配置和全局配置同时存在
局部 > 全局 (优先执行局部的)
2 全局和局部有什么不同?
全局的好处在于无需重复写代码,但是跳转的页面却很单一
局部的好处在于用户还没登录的时候,可以跳转到不同的页面
# 两个例子
@login_required
def set_password(request):
pass
@login_required(login_url='/login/')
def set_password(request):
pass
如何扩展auth_user表
'扩展auth表的两种方式'
#第一种 : 一对一关系 (不推荐)
class UserDetail(models.Model):
phone = models.BigIntegerField()
user = models.OneToOneField(to='User')
# 第二种: 利用面向对象的继承
# 写一个类继承AbstractUser
class UserInfo(AbstractUser):
phone =models.BigIntegerField()
create_time = models.DateTimeField(auto_now_add=Ture)
如果继承了AbstractUser
那么再执行数据库迁移命令的时候auth_user表就不会再创建出来了
而Userinfo表中会出现auth_user所有的字段外加自己扩展的字段
这么做的好处在于,能够直接点击自己的表,更加快速的完成操作及扩展
前提:
1 在继承之前没有执行过数据库迁移命令
auth_user没有被创建,如果当前库已经被创建了,那么就重新换一个库
2 继承的类里面,不要覆盖AbstractUser里面的字段名
表里面有的字段都不要动,只扩展就行
3 需要在配置文件中告诉django,要用UserInfo替代auth_user
不然以后的数据不会添加到表中
AUTH_USER_MODEL = 'app01.UserInfo'
'应用名.表名'
'总结'
如果自己写表替代了auth_user
auth模块的功能还是自己使用,参考的表页由原来的auth_user变成了UserInfo
'之前源码中 .user的地方都换成了 .UserInfo(自己创建的表)'
例如:
request.user.set_password(new_password) # 改为下面的
request.UserInfo.set_password(new_password)