教师vs学生注册流程全拆解:django-multiple-user-types-example双用户类型注册表单实现教程
【免费下载链接】django-multiple-user-types-exampleDjango Quiz Application项目地址: https://gitcode.com/gh_mirrors/dj/django-multiple-user-types-example
本文带你完整拆解django-multiple-user-types-example(一个 Django Quiz Application 示例项目)中教师与学生双用户类型注册表单的实现。你只需跟着本文走一遍,就能理解 Django 多用户类型注册的核心套路:自定义 User 模型、两个注册表单、身份校验装饰器,最后 4 个命令在本地跑起来 🚀。
1. 为什么"多用户类型"总让新手卡住?
Django 自带的认证系统里只有一种用户。但现实场景中,同一个网站往往有多种角色:
- 👩🏫教师:创建测验(Quiz)、添加题目、查看成绩
- 🧑🎓学生:选择感兴趣的科目、作答测验、查看历史成绩
本项目的解法非常朴素:在自定义的User模型上加两个布尔字段is_student和is_teacher,注册时由不同的表单负责把它们置为True。模型定义在 django_school/classroom/models.py 中,学生还通过一个一对一的Student扩展模型关联"感兴趣的科目",这是后面注册流程差异的根源。
2. 注册流程全拆解:从选择身份到自动登录
2.1 统一入口:一个页面,两条注册路径
访问accounts/signup/时,用户先看到一个身份选择页(模板 django_school/templates/registration/signup.html),页面上有两个大按钮:"I'm a student"和"I'm a teacher",分别跳转到两条独立路由:
accounts/signup/student/→StudentSignUpViewaccounts/signup/teacher/→TeacherSignUpView
路由注册在 django_school/django_school/urls.py。这种"一个入口页 + 多个具体注册视图"的结构,是双用户类型注册表单最常见的落地方式。
2.2 教师注册:最简配置,保存即完成
教师表单TeacherSignUpForm定义在 django_school/classroom/forms.py,逻辑极其轻量:
- 继承 Django 内置的
UserCreationForm(自带用户名、密码、密码确认三项校验) - 重写
save():先把commit=False存下来,再设置user.is_teacher = True,最后保存
视图TeacherSignUpView(位于 django_school/classroom/views/teachers.py)在表单合法后调用login()自动登录,并跳转到教师管理页teachers:quiz_change_list。用户全程零额外操作。
2.3 学生注册:多一个"兴趣科目"选择 + 事务保护
学生表单StudentSignUpForm与教师版有三个关键差异,这也是全文最值得学的部分:
- 多一个必填字段:
interests使用ModelMultipleChoiceField+CheckboxSelectMultiple渲染成复选框组,数据源是Subject.objects.all(),注册时必须勾选感兴趣的科目 - 一次保存,两条记录:
save()里先创建User(置is_student = True),紧接着创建一对一的Student记录,并批量写入兴趣科目 @transaction.atomic装饰器:保证"建用户 + 建 Student + 写兴趣"三步要么全成功、要么全回滚,避免出现"用户注册成功但 Student 记录缺失"的脏数据
视图StudentSignUpView(django_school/classroom/views/students.py)同样自动登录,但跳转到students:quiz_list——登录后立刻按身份分流,教师进后台、学生进测验列表。
💡 模板层面,两种表单共用同一个
registration/signup_form.html,视图通过get_context_data注入不同的user_type(student/teacher),页面标题就能动态显示 "Sign up as a student/teacher",一套模板服务两种角色。
3. 注册之后:身份校验装饰器如何兜底
注册只是把字段写上,真正的"门禁"靠装饰器。django_school/classroom/decorators.py 基于 Django 内置的user_passes_test封装了两个装饰器:
| 装饰器 | 校验条件 | 不通过时 |
|---|---|---|
student_required | u.is_active and u.is_student | 重定向到登录页 |
teacher_required | u.is_active and u.is_teacher | 重定向到登录页 |
所有学生视图(测验列表、答题、兴趣设置)和教师视图(创建/编辑/删除测验)都叠加了login_required+ 对应装饰器。即使有人手动改库把身份字段改错,也无法越权访问,这是多用户类型项目最关键的防线。
4. 本地快速运行:4 个命令跑起来
git clone https://gitcode.com/gh_mirrors/dj/django-multiple-user-types-example pip install -r requirements.txt python manage.py migrate python manage.py runserver打开127.0.0.1:8000,依次体验"选择身份 → 教师/学生表单 → 自动登录 → 分流向导"的完整闭环,对照本文流程复盘会事半功倍 ✅。依赖清单见 requirements.txt。
5. 小结:把这套模式带到你自己的项目
本文拆解的双用户类型注册表单,核心可复用技巧只有 3 条:
- 模型层:
AbstractUser加布尔字段标识角色,扩展数据用一对一模型承接 - 表单层:每个角色一个
UserCreationForm子类,在save()里设置身份并落库,多步写入务必加@transaction.atomic - 视图层:统一入口页分流到各自注册视图,注册后自动登录 + 按身份重定向,再用
user_passes_test装饰器守住业务视图
理解了 django-multiple-user-types-example 的这套注册表单实现,你以后做"商家/买家""导师/学员"等多角色注册时,基本可以直接套用这套结构。
【免费下载链接】django-multiple-user-types-exampleDjango Quiz Application项目地址: https://gitcode.com/gh_mirrors/dj/django-multiple-user-types-example
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考