构建用户模块:多角色登录与权限控制(Accounts)
在前面的章节中,我们已经完成了:
- 班级管理
- 老师管理
- 学生管理
- 成绩管理
到这里,一个校园管理系统的业务数据部分已经基本成型。
接下来,我们要做的是—— 让不同的人,用不同的身份,看到不同的内容。
这正是「用户模块」要解决的问题。
1.用户模块要解决什么问题?
在我们的系统中,一共有 三类用户:
| 角色 | 能做什么 |
|---|---|
| 管理员 | 管理所有模块 |
| 老师 | 管理学生与成绩 |
| 学生 | 只能查看自己的成绩 |
因此,用户模块需要解决三件事:
- 登录(Login)
- 角色区分(Role)
- 权限控制(Permission)
本节课,我们先完成登录功能,权限控制会在后面单独讲。
2.为什么不用三套登录页面?
一个很自然的问题是:
管理员、老师、学生, 登录方式都不一样, 为什么不用三套登录页面?
原因很简单:
- 用户体验差
- 维护成本高
- 逻辑重复严重
所以我们的方案是:
一个登录页面 + 一个登录接口,根据角色动态处理
页面效果如下:

3.URL 设计:统一入口
首先,在全局 urls.py 中注册登录入口:
# 代码位置:config/urls.py
from accounts import views
urlpatterns = [
path('login/', views.user_login, name='user_login'),
]
这里我们刻意没有使用 login 这个名字,而是叫:user_login
原因是 Django 内置也有一个 login 方法,避免命名冲突,可以减少很多隐性 Bug。
4.登录页面设计(login.html)
登录页面只有一个,但支持三种角色。
1️⃣ 角色选择
# 代码位置: templates/accounts/login.html
<div class="input-group">
<label for="role">选择身份:</label>
<div class="radio-group">
<input type="radio" id="admin" name="role" value="admin">
<label for="admin">管理员</label>
<input type="radio" id="teacher" name="role" value="teacher">
<label for="teacher">老师</label>
<input type="radio" id="student" name="role" value="student">
<label for="student">学生</label>
</div>
</div>
所有 radio 使用 同一个 name,这样提交时后台只会收到一个 role。
2️⃣ 根据角色动态切换输入提示
管理员登录用的是:
- 用户名 + 密码
老师登录用的是:
- 手机号 + 密码
学生登录用的是:
- 学籍号 + 密码
但在 HTML 层面,我们只用一个 input:
<input type="text" name="username">
真正的区分逻辑,交给 JavaScript。
继续阅读完整内容
以上为免费预览。前往「Django + Vue 全栈课程」,查看后续完整讲解、案例演示和配套资料。
查看课程详情