如何在Django Admin中创建含多道试题的Test(考试)模型?
在Django Admin中直接创建带试题的考试(Test)
完全不用从零编写逻辑!Django Admin自带的内联(Inline)功能就能完美解决你的需求,刚好适配你这种用显式中间表TestQuestion关联Test和Question的场景。下面是具体的实现步骤:
1. 先修正模型的小细节(可选但推荐)
你的模型代码里有几个小问题需要调整,同时重写__str__方法能让Admin后台的选择体验更友好:
class Question(models.Model): # CharField必须指定max_length参数 question = models.CharField(max_length=255) # Boolean()是旧写法,应该用BooleanField() answer_a = models.BooleanField() solution_a = models.BooleanField() # 其他选项字段... def __str__(self): # 让下拉框显示试题内容,而非默认的"Question object" return self.question class Test(models.Model): name = models.CharField(max_length=255) # 其他字段... def __str__(self): # 列表页和选择框直接显示考试名称 return self.name class TestQuestion(models.Model): """将多道试题关联到一个考试""" # 别忘了添加on_delete参数,这是Django外键的必填项 test_fk = models.ForeignKey(Test, on_delete=models.CASCADE) question_fk = models.ForeignKey(Question, on_delete=models.CASCADE)
2. 配置Admin内联
在你的admin.py文件中,创建TestQuestion的内联类,并关联到Test的Admin配置里:
from django.contrib import admin from .models import Test, Question, TestQuestion # 创建内联类,用于在Test的编辑页面直接添加关联试题 class TestQuestionInline(admin.TabularInline): model = TestQuestion extra = 3 # 默认显示3个空的试题添加框,可根据需求调整数量 fields = ['question_fk'] # 只显示试题选择框,test_fk会自动关联当前编辑的Test exclude = ['test_fk'] # 隐藏test_fk字段,避免用户手动修改 # 注册Test模型,并绑定内联类 @admin.register(Test) class TestAdmin(admin.ModelAdmin): inlines = [TestQuestionInline] # 注册Question模型,方便提前批量创建试题 @admin.register(Question) class QuestionAdmin(admin.ModelAdmin): list_display = ['question', 'solution_a'] # 列表页直接显示试题和正确答案
3. 效果说明
配置完成后重启Django服务,进入Admin后台就能看到效果:
- 你可以先在「Question」页面创建好所有需要的试题;
- 当创建或编辑「Test」时,页面下方会出现一个表格(如果换成
StackedInline会变成堆叠样式),你可以直接从下拉框选择已有的试题,或者点击下拉框旁的加号直接在当前页面新建试题; - 保存Test时,关联的
TestQuestion记录会自动生成,不需要额外编写关联逻辑。
如果以后你的TestQuestion中间表需要添加额外字段(比如试题分数、排序顺序),只要把新增字段加到fields列表里,内联配置依然能正常工作。
内容的提问来源于stack exchange,提问作者Saleri
相关产品推荐
相关产品推荐

