我需要能够创建一个包含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 <class 'quizzer.quiz.models.Quiz'>
这是可行的,还是我试图从Django Admin应用程序中抽出太多东西?
答案 0 :(得分:14)
你不能在Django管理员中做"nested" inlines(即你不能进行内联问题的测验,每个内联问题都有内联答案)。所以你需要降低你的目标只是内联问题(然后如果你导航到查看一个问题,它可能有内联答案)。
所以你的模型很好,但你的管理代码应该是这样的:
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个实际问题)。也许这就是你想要的 - 制作一个很长的页面,但可以很容易地一次添加很多问题。
答案 1 :(得分:3)
让我们一步一步地进行。
错误:“答案没有FK进行测验”。
这是对的。答案模型没有测验的FK。它有一个FK to Question,但没有Quiz。
为什么答案需要FK才能进行测验?
QuizAdmin有一个AnswerInline和一个QuestionInline。对于具有内联的管理员,这意味着内联模型(答案和问题)必须具有父管理员的FK。
我们来看看。问题有一个FK测验。
和。答案对测验没有FK。因此,您的测验管理员需要您的模型缺少的FK。那是错误。
答案 2 :(得分:2)
正确:试图从管理员应用程序中抽出太多内容:)内联模型需要父模型的外键。