我需要能够创建一个带有20个奇怪的多项选择问题的测验类型应用程序.
我有3种型号:Quizzes
,Questions
,和Answers
.
我想在管理界面中创建一个测验,并内联测验和答案元素.
目标是单击"添加测验",然后转移到包含20个问题字段的页面,每个字段有4个答案字段.
这是我目前的情况:
class Quiz(models.Model): label = models.CharField(blank=true, max_length=50) class Question(models.Model): label = models.CharField(blank=true, max_length=50) quiz = models.ForeignKey(Quiz) class Answer(models.Model): label = models.CharField(blank=true, max_length=50) question = models.ForeignKey(Question) class QuestionInline(admin.TabularInline): model = Question extra = 20 class QuestionAdmin(admin.ModelAdmin): inlines = [QuestionInline] class AnswerInline(admin.TabularInline): model = Answer extra = 4 class AnswerAdmin(admin.ModelAdmin): inlines = [AnswerInline] class QuizAdmin(admin.ModelAdmin): inlines = [QuestionInline, AnswerInline] admin.site.register(Question, QuestionAdmin) admin.site.register(Answer, AnswerAdmin) admin.site.register(Quiz, QuizAdmin)
当我尝试添加测验时出现以下错误:
class 'quizzer.quiz.models.Answer'> has no ForeignKey to
这是可行的,还是我试图从Django Admin应用程序中抽出太多东西?
您不能在Django管理员中执行"嵌套"内联(即,您不能使用内联问题进行测验,每个内联问题都有内联答案).因此,您需要降低您的视线以获得内联问题(然后,如果您导航以查看单个问题,则可能具有内联答案).
所以你的模型很好,但你的管理代码应该是这样的:
class QuestionInline(admin.TabularInline): model = Question extra = 20 class AnswerInline(admin.TabularInline): model = Answer extra = 4 class QuestionAdmin(admin.ModelAdmin): inlines = [AnswerInline] class AnswerAdmin(admin.ModelAdmin): pass class QuizAdmin(admin.ModelAdmin): inlines = [QuestionInline]
AnswerAdmin有一个AnswerInline或QuestionAdmin有一个QuestionInline是没有意义的(除非这些是具有自引用外键的模型).并且QuizAdmin不能有AnswerInline,因为Answer没有测验的外键.
如果Django支持嵌套内联,则逻辑语法将是QuestionInline接受"inlines"属性,您将其设置为[AnswerInline].但事实并非如此.
另请注意,"额外= 20"表示每次测验时,每次测验的底部都会有20个空白问题表格(即使已经有20个实际问题).也许这就是你想要的 - 制作一个长页面,但可以很容易地一次添加很多问题.