背景
页面中有很多的功能,对于不同的权限需要展示不同的页面,不同的权限可以操作的范围也不同,所以需要进行登录操作,并进行权限管理。
用户应用
创建应用
使用python manage.py startapp
创建一个users
应用
(venv) (base) zhongxin:backend zhongxin$ python manage.py startapp users
创建成功后,为了方便管理,将应用统一移动到apps
文件夹
设置环境变量
在backend/LightSeeking/settings.py
的INSTALLED_APPS
中添加刚创建的应用
不过因为我们换了创建应用的路径,所以需要将新的路径添加到环境变量中,不然项目无法识别到
代码语言:javascript复制import sys
from datetime import timedelta
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(BASE_DIR / 'apps'))
在环境变量路径的首位添加了一个拼接了BASE_DIR
和apps
的路径
这里的操作Pycharm是无法识别到的,所以为了达到同样的效果,需要将apps标记为「源代码根路径」
标记后文件夹就会变成蓝色
安装应用
然后修改INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework_simplejwt',
'django_filters',
'corsheaders',
'drf_yasg',
'users.apps.UsersConfig',
]
用户模块
Django有自带了一个用户管理模块,所以不再从头编写,而是从它的基础上进行二次开发
用户表
Django自带用户管理模块的models.py
文件为:
from django.contrib.auth.models import AbstractUser
简单看一下AbstractUser
和它的父类
它里面包含了很多登录的常用字段了
代码语言:javascript复制id
password
last_login
is_superuser
username
first_name
last_name
email
is_staff
is_active
date_joined
groups
user_permissions
我们给它加上3个字段:
手机号
代码语言:javascript复制mobile = models.CharField(
'手机号码', max_length=, unique=True, help_text='手机号码', error_messages={
'unique': '手机号码已注册',
'max_length': '手机号码长度不正确',
}, validators=[validate_mobile]
)
models.CharField:手机号为varchar
类型
max_length=11:手机号最长为11位
unique=True:手机号唯一
error_messages是一个键值对,键表示异常的校验,值表示异常的提示
validators:自定义异常校验
使用正则编写一个手机号格式校验函数validate_mobile
手机号必须以1开头
,第二位是3-9
,后面还有9位数字
def validate_mobile(value):
if not re.match(r'1[3-9]d{9}', value):
raise ValidationError("手机号码格式不正确")
用户姓名
格式为varchar
类型最大长度为11位
name = models.CharField('姓名', max_length=, help_text='姓名', error_messages={'max_length': '姓名长度不正确', })
权限列表
代码语言:javascript复制roles = models.CharField('权限', max_length=, help_text='权限', null=True)
null=True:允许为空
完整代码
代码语言:javascript复制import re
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core.exceptions import ValidationError
def validate_mobile(value):
if not re.match(r'1[3-9]d{9}', value):
raise ValidationError("手机号码格式不正确")
class User(AbstractUser):
mobile = models.CharField(
'手机号码', max_length=, unique=True, help_text='手机号码', error_messages={
'unique': '手机号码已注册',
'max_length': '手机号码长度不正确',
}, validators=[validate_mobile]
)
name = models.CharField('姓名', max_length=, help_text='姓名', error_messages={'max_length': '姓名长度不正确', })
roles = models.CharField('权限', max_length=, help_text='权限', null=True)
REQUIRED_FIELDS = ['mobile', 'name'] # 在通过 createsuperuser 管理命令创建用户时,将提示输入mobile字段
def __str__(self):
return self.username
class Meta:
db_table = 'tb_user' # 表名
verbose_name = 'user' # 站点显示名
verbose_name_plural = 'users' # 复数显示
指定本项目用户模型类
在backend/LightSeeking/settings.py
中指定AUTH_USER_MODEL
AUTH_USER_MODEL = 'users.User'
数据库迁移
代码语言:javascript复制python manage.py makemigrations
python manage.py migrate
代码语言:javascript复制(venv) (base) zhongxin:backend zhongxin$ python manage.py makemigrations
Migrations for 'users':
apps/users/migrations/0001_initial.py
- Create model User
(venv) (base) zhongxin:backend zhongxin$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, users
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying users.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying sessions.0001_initial... OK
迁移过程文件
迁移过程中会生成backend/apps/users/migrations/0001_initial.py
里面包含了迁移时候会创建的字段和相关信息
所以在提交代码的时候不要忘了它,下次数据库没有变更
,进行迁移的时候只需要输入
python manage.py migrate
查看生成的表
打开数据库连接工具,以SQLite方式进行连接
文件路径为backend/db.sqlite3
在开发阶段先使用
db.sqlite3
,后面会使用Mysql
存储数据