我需要能够创建一个包含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。那是错误。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top