没有外键 在Django中尝试内联模型时
问题内容:
我需要能够使用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没有到Quiz的外键。
如果Django确实支持嵌套内联,则逻辑语法将使QuestionInline接受“内联”属性,您可以将其设置为[AnswerInline]。但事实并非如此。
还要注意,“ extra = 20”表示每次加载时,每个测验的底部都会有20个空白问题表格(即使它已经有20个实际问题)。也许这就是您想要的-
可以使页面很长,但是可以轻松一次添加很多问题。