<类>没有外键到< class>在Django尝试内联模型时
-
03-07-2019 - |
题
我需要能够创建一个包含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应用程序中抽出太多东西?
解决方案
你无法“嵌套”。 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]。但事实并非如此。
还要注意“extra = 20”和“extra = 20”。意味着每次测验时你都会在每个测验的底部有20个空白的问题表格(即使它已经有20个实际问题)。也许这就是你想要的 - 制作一个很长的页面,但可以很容易地一次添加很多问题。
其他提示
让我们一步一步地进行。
错误:“答案没有FK到测验”。
这是对的。答案模型没有测验的FK。它有一个FK to Question,但没有Quiz。
为什么答案需要FK才能进行测验?
QuizAdmin有一个AnswerInline和一个QuestionInline。对于具有内联的管理员,这意味着内联模型(答案和问题)必须具有父级管理员的FK。
我们来看看。问题有一个FK测验。
和。答案对测验没有FK。因此,您的测验管理员需要您的模型缺少的FK。那是错误。
正确:试图从管理员应用程序中抽出太多内容:)内联模型需要父模型的外键。