Django中没有外键当试图内联模型
我需要能够创建一个20个一些奇怪的选择题的测验类型的应用程序。我有3个型号:Quizzes
,Questions
和Answers
。我有3个型号:,Questions
和Answers
。我有3个型号:,Questions
和Answers
。<class> Django中没有外键<class>当试图内联模型
我想在管理界面中创建测验,并内嵌测验和答案元素。
目标是点击“添加测验”,并转移到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管理员应用程序?
您不能在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接受您设置为[AnswerInline]的“内联”属性。但事实并非如此。
另外请注意,“extra = 20”表示每次测验底部会有20个空白问题表单,每次加载时(即使它已经有20个实际问题)。也许这就是你想要的 - 让一个长页面,但很容易一次添加很多问题。
正确:试图拉太多管理应用程序:)内联模型需要父模型的外键。
让我们一步步地进行。
错误:“答案没有FK测验”。
这是正确的。答案模型没有FK来测验。它有问题的FK,但不是测验。
为什么Answer需要FK来测验?
QuizAdmin有一个AnswerInline和一个QuestionInline。要让管理员拥有内联,这意味着内联模型(答案和问题)必须对父管理员具有FK。
让我们来看看。问题有测验的FK。
而且。答案没有FK来测验。所以你的测验管理员需要一个你的模型缺乏的FK。这是错误。