6

我需要能够创建一个包含 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 应用程序中提取太多内容?

4

3 回答 3

14

您不能在 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 没有 Quiz 的外键。

如果 Django 确实支持嵌套内联,则 QuestionInline 的逻辑语法是接受您设置为 [AnswerInline] 的“内联”属性。但事实并非如此。

另请注意,“extra = 20”意味着每次加载时,每个测验的底部都会有 20 个空白问题表格(即使它已经有 20 个实际问题)。也许这就是您想要的 - 使页面很长,但可以轻松地一次添加大量问题。

于 2009-03-04T15:46:04.660 回答
3

让我们一步一步来。

错误:“Answer has no FK to Quiz”。

这是正确的。答案模型对测验没有 FK。它有一个 FK 要提问,但没有测验。

为什么 Answer 需要 FK 才能进行测验?

QuizAdmin 有一个 AnswerInline 和一个 QuestionInline。对于具有内联的管理员,这意味着内联模型(答案和问题)必须具有父管理员的 FK。

让我们检查。问题对测验有一个 FK。

和。答案对测验没有 FK。因此,您的测验管理员需要您的模型缺少的 FK。这就是错误。

于 2009-03-04T10:51:57.097 回答
2

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

于 2009-03-04T07:41:15.697 回答