扩展Django内置的auth模块代码示例
一,创建自定义User模型类。继承AbstractUser
方法1
新建一个表,表里面有手机号,邮箱,地址,一对一与User表进行关联
方法2
新定义一个类,继承类AbstractUser ( auth模块的User类也是继承此AbstractUser 类的)
说明:python 语法上,也是可以直接继承User类的
以下代码,我们扩展了两个字段,phone和addr
注意:settings.py中一定要指不使用内置的User表,而是使用新的UserInfo表
AUTH_USER_MODEL='app类名.类名'
models.py中:
from django.contrib.auth.models import AbstractUser # 使用类的的继承来扩展auth模块的AbstractUser类 class UserInfo(AbstractUser): phone = models.CharField(max_length=11) addr = models.CharField(max_length=128)
settins.py文件中
# 如果使用继承 的方式,使用auth模块,则要在settings.y里面配置,默认用户认证时使用的是哪个类对应的数据库表 # 这里我们亲定义的类是UserInfo,所以表就是UserInfo AUTH_USER_MODEL='myApp.UserInfo'
注意:
改变 AUTH_USER_MODEL
对你的数据库结构有很大的影响。它改变了一些会使用到的表格,并且会影响到一些外键和多对多关系的构造。
如果你打算设置AUTH_USER_MODEL
, 你应该在创建任何迁移或者第一次运行 manage.py migrate
前设置它。
在你有表格被创建后更改此设置是不被makemigrations支持的,并且会导致你需要手动修改数据库结构,从旧用户表中导出数据,可能重新应用一些迁移。
就是说:
执行 python manage.py makemigrations 之前,要把所有的迁移文件删除掉,再执行makemigrations命令,因这样才能保证不会出错。
数据库最好也是删除后重新create
二,使用新表
views.py中代码:下面以创建用户代码示例,只需导入UserInfo表,然后就可以直接使用UserInfo新表了。
# 创建用户,即注册 def register(request): # from django.contrib.auth.models import User # User.objects.create(username='alex',password='alex1234') ## 这个不能用,因为数据库里保存的密码是明文的,我们使用username,password登录不了 # User.objects.create_user(username='alex1',password='alex1234') # 创建普通用户 # User.objects.create_superuser(username='alex3',email='',password='alex1234') # 创建超级用户,必须还有email参数 from myApp.models import UserInfo # 创建用户 user_obj=UserInfo.objects.create_user(username='alex6',password='alex1234') # 检查密码(一般用于修改密码前验证) ret=user_obj.check_password('alex12345') print(ret) #返回False # 修改密码 user_obj.set_password('alex12345') # 修改后保存 user_obj.save() # 修改后再检查 ret=user_obj.check_password('alex12345') print (ret) # 返回True return HttpResponse('o98k')