在尝试内联模型</class> </class>时,<class>在Django中没有<class>的外键

时间:2009-03-04 07:22:28

标签: python django django-admin

我需要能够创建一个包含20个奇怪的多项选择问题的测验类型应用程序。

我有3个模型:QuizzesQuestionsAnswers

我想在管理界面中创建一个测验,并内联测验和答案元素。

目标是点击“添加测验”,然后转移到包含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应用程序中抽出太多东西?

3 个答案:

答案 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)

正确:试图从管理员应用程序中抽出太多内容:)内联模型需要父模型的外键。