没有外键 在Django中尝试内联模型时


问题内容

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

我有3种型号:QuizzesQuestions,和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没有到Quiz的外键。

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

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