教师vs学生注册流程全拆解:django-multiple-user-types-example双用户类型注册表单实现教程
2026/9/19 8:55:31 网站建设 项目流程

教师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_studentis_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/StudentSignUpView
  • accounts/signup/teacher/TeacherSignUpView

路由注册在 django_school/django_school/urls.py。这种"一个入口页 + 多个具体注册视图"的结构,是双用户类型注册表单最常见的落地方式。

2.2 教师注册:最简配置,保存即完成

教师表单TeacherSignUpForm定义在 django_school/classroom/forms.py,逻辑极其轻量:

  1. 继承 Django 内置的UserCreationForm(自带用户名、密码、密码确认三项校验)
  2. 重写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_typestudent/teacher),页面标题就能动态显示 "Sign up as a student/teacher",一套模板服务两种角色。

3. 注册之后:身份校验装饰器如何兜底

注册只是把字段写上,真正的"门禁"靠装饰器。django_school/classroom/decorators.py 基于 Django 内置的user_passes_test封装了两个装饰器:

装饰器校验条件不通过时
student_requiredu.is_active and u.is_student重定向到登录页
teacher_requiredu.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 条:

  1. 模型层AbstractUser加布尔字段标识角色,扩展数据用一对一模型承接
  2. 表单层:每个角色一个UserCreationForm子类,在save()里设置身份并落库,多步写入务必加@transaction.atomic
  3. 视图层:统一入口页分流到各自注册视图,注册后自动登录 + 按身份重定向,再用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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询