SkyLearn在线测验系统深度剖析:3种题型、题目随机化与单次作答限制怎么做
【免费下载链接】SkyLearn
The world’s lightweight learning management system. Using django web framework. Basic staff like course add and drop, grade and assessment result management, online quiz, report generator, student and lecturers management, dashboard, and etc.
SkyLearn 是一款基于 Django 的轻量级开源学习管理系统(LMS),其在线测验模块内置了完整考核能力:3 种题型、两级题目随机化和单次作答限制,开箱即用。本文带你快速看懂这些功能在quiz模块里的实现思路。
一、SkyLearn 测验模块全景:核心文件一览 🧭
SkyLearn 的测验功能集中在 quiz/ 目录下,围绕"测验 → 题目 → 作答 → 评分"这条主线组织,核心文件如下表:
| 文件 | 职责 |
|---|---|
| quiz/models.py | Quiz、Question(3 种题型)、Choice、Sitting、Progress数据模型 |
| quiz/views.py | 测验创建、学生答题(QuizTake)、教师批改视图 |
| quiz/forms.py | 答题表单与选择题选项校验 |
| templates/quiz/question.html | 逐题作答页面模板 |
| quiz/urls.py | 测验路由定义 |
下图是 SkyLearn 管理后台界面,可以看到测验记录(Complete Exams、Quiz Progress Rec)在侧边栏中与课程、成绩模块并列,是系统考核体系的重要一环:
二、3种题型怎么做:多表继承建模 📝
题目基于 quiz/models.py 中的Question基类,通过多表继承(InheritanceManager)派生出两种具体题型,配合基类能力共支撑 3 种用法:
- 基类
Question:quiz多对多关系、content题干、explanation答案解析、figure配图字段,所有题型共享。 - 选择题
MCQuestion(L402-L442):每个选项是独立的Choice记录(文本 +correct布尔标记),答题时调用check_if_correct直接比对选项是否为正确答案。 - True/False 判断题:无需单独模型——把一道
MCQuestion只配置 "True"/"False" 两个选项即可,系统天然按单选逻辑判分。 - 问答题
EssayQuestion(L468-L483):check_if_correct固定返回False,表示"需要人工批改",作答内容通过EssayForm的文本域收集。
表单层做了严格兜底:quiz/forms.py 中的MCQuestionFormSet会校验至少两个选项、且恰好一个选项标记为正确,从源头保证题目质量;学生作答表单则按题型动态切换——选择题用QuestionForm(单选按钮),问答题自动换成EssayForm(见 quiz/views.py 的get_form_class)。
三、题目随机化怎么做:两级乱序机制 🔀
SkyLearn 的随机化分两层,分别控制"题目顺序"和"选项顺序",防止学生互相抄答案:
1. 题目级乱序:random_order开关
在Quiz模型上勾选random_order(L59-L63)后,学生每次进入测验创建作答会话(Sitting)时,系统会用order_by("?")对题目随机洗牌并固化到本次会话中(SittingManager.new_sitting):
- 不同学生拿到不同的题目顺序;
- 顺序在学生本次作答期间保持不变,中途退出再续答时不会跳题。
2. 选项级乱序:choice_order三档
MCQuestion的choice_order字段支持三种模式(L424-L430):
random:选项每次随机排列(默认);content:按选项文本排序;none:保持录入顺序。
两层组合后,即使题目相同,每个学生看到的试卷呈现也完全不同——这就是"防抄袭"的关键设计。
四、单次作答限制怎么做:Sitting 会话拦截 🔒
单次作答限制由Quiz.single_attempt开关驱动,逻辑分三步:
- 强制存档:
Quiz.save()中,一旦勾选单次作答,会自动将exam_paper置为True(L107-L114),确保该次成绩被持久保存用于后续查看与批改。 - 入口拦截:进入答题页时,
SittingManager.user_sitting会先检查该用户是否已有已完成的会话,若有则直接返回False(L218-L232);视图层随即提示 "You have already completed this quiz. Only one attempt is permitted." 并跳回测验列表(quiz/views.py)。 - 断点续答:若已有未完成会话,则直接复用、从中断处继续——学生可以放心退出再回来,但不消耗第二次机会。
作为对照,非考试类测验(未开exam_paper)完成作答后会直接删除临时会话记录(final_result_user),只保留分数统计,进一步减小数据冗余。
五、作答与判分流程:逐题推进、即时计分 ⏱️
QuizTake视图(quiz/views.py)实现了完整的答题生命周期:
- 逐题展示:
Sitting用question_list队列保存题目顺序,答完一道自动弹出下一题,首题会弹窗提示"提交后不可回退"(见 question.html); - 即时计分:答对调用
add_to_score,答错记录进incorrect_questions,同时更新用户维度累计成绩(Progress模型); - 两种反馈模式:
answers_at_end关闭时每答完一题即展示对错与解析;开启则所有答案统一在结算页集中呈现; - 及格判定:结算页按
pass_mark(默认 50%)自动判定通过/未通过,并给出对应提示语。
六、批改与成绩追踪:问答题闭环 ✍️
- 人工批改:教师通过
QuizMarkingList/QuizMarkingDetail视图筛选已完成的作答记录,对问答题逐题切换"正确/错误"状态即可实时调整得分(quiz/views.py); - 成绩沉淀:
Progress模型按测验记录累计得分,学生可在 Progress 页面查看历次考试成绩与通过率; - 多语言支持:题目、选项均带翻译字段(见 quiz/migrations/),配合 locale/ 目录支持俄语、法语、西班牙语等界面切换。
七、小结:这套设计值得借鉴的 3 点
| 能力 | 实现要点 | 设计亮点 |
|---|---|---|
| 3 种题型 | 多表继承 + 策略方法check_if_correct | 判断题零成本复用选择题,问答题留好人机分工 |
| 题目随机化 | random_order洗牌 +choice_order三档 | 顺序固化在会话中,续答不乱 |
| 单次作答 | single_attempt强制存档 + 会话入口拦截 | 未完成可续答,已完成硬拦截 |
SkyLearn 用最精简的模型(1 个Sitting+ 1 个Progress)就撑起了从组卷、防抄袭到人工批改的完整闭环,非常适合作为 Django LMS 项目的学习范本。
【免费下载链接】SkyLearn
The world’s lightweight learning management system. Using django web framework. Basic staff like course add and drop, grade and assessment result management, online quiz, report generator, student and lecturers management, dashboard, and etc.
相关推荐
createSlicer与getSubset是怎么工作的?redux-localstorage状态子集筛选机制深度剖析
createSlicer与getSubset是怎么工作的?redux localstorage状态子集筛选机制深度剖析 redux localstorage 是
实验中断怎么办?BenchMARL日志、检查点与断点恢复机制深度剖析
实验中断怎么办?BenchMARL日志、检查点与断点恢复机制深度剖析 BenchMARL 是一个多智能体强化学习(MARL)基准测试库,让你能基于统一、可复现的
Protobuf.js 可视化:二进制数据怎么变成看得懂的图?三个真实场景
Protobuf.js 可视化:二进制数据怎么变成看得懂的图?三个真实场景 调试时盯着控制台里的一串十六进制,你得对着 .proto 文件一个个字段查。prot
后端开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考