一、原理:
基于sqlite自带的user表就继承自AbstractUser,我们可以通过继承内置的 AbstractUser 类,来定义一个自己的user表,即可根据项目需求灵活的设计用户表,又能使用Django强大的认证系统。
二、前期准备:
(运行是通过ubuntu的anaconda环境运行的)
1、确保删除之前sqlite3里创建的所有数据表
以下是SQLiteStudio实现可视化,但并无法对导入的数据表进行操作
因此,我们可以通过ubuntu(xshell连接)进入内置sqlite运行命令行:sqlite3 你的sqlite3数据库
删除所有表:(drop table 表名;)
2、删除你的所有app的migrations下除__init__.py外的所有文件。
3、确认所有清理完成后,再在相应文件编写代码如下:
你的app下的models.py:(注意了,不可以用原来的表名user即不可建立model名为User,这里用的是UserInfo)
from django.contrib.auth.models import AbstractUser
# 新用户表
class UserInfo(AbstractUser):
username = models.CharField(max_length=50, verbose_name='用户名', unique=True)#用户名
password = models.CharField(max_length=100,verbose_name= '密码')#密码
qq = models.CharField(max_length=20, verbose_name='QQ号')#qq
email = models.EmailField(max_length=254)#邮箱
name=models.CharField(max_length=50,verbose_name='姓名')#真实姓名
gender = models.CharField(choices=(('male', '男'), ('female', '女')), default='female', max_length=5)#性别
age=models.IntegerField(verbose_name='年龄')#年龄
image = models.ImageField(upload_to='img/%Y/%m', max_length=100)#/media/img/上传头像
# role = models.CharField(max_length=10, default='user', choices=(('user', '普通用户'), ('admin', '管理员'), ('vip', 'VIP')))
last_active = models.DateField(auto_now_add=True)#最后活动时间
created_time = models.DateTimeField(auto_now_add=True)#创建时间
last_login = models.DateTimeField(null=True)#登录时间
class Meta:
ordering = ['-id']
verbose_name = '用户信息'
verbose_name_plural = '用户信息'
def __str__(self):
return self.username
2、修改settings.py增加AUTH_USER_MODEL=你的app名.UserInfo参数,即是告诉Django,现在使用新定义的UserInfo表来做用户认证:
还有,上传图片的:
3、要在你的app下的admin.py登记注册,不然密码会变成明文,无法加密存储:
from . import models
from django.contrib.auth.admin import UserAdmin
admin.site.register(models.UserInfo, UserAdmin)
将以上文件上传好
三、创建新用户表
运行以下命令:
python manage.py makemigrations
python manage.py migrate
效果如下:
四、有可能出现的问题
到这里已经差不多成功了,但是运行时有可能还会报错:
raise ValueError("Dependency on app with no migrations: %s" % key[0])
ValueError: Dependency on app with no migrations: index
打开PyCharm的manage.py Task,
输入:makemigrations 你的APP名(这里应是makemigrations index,以下为例子不符合这里,仅作示例),如下:
最后再运行:python manage.py migrate,迁移数据就可以更新数据库了。