Python <;类别>;没有指向<;的外键;类别>;在Django中尝试内联模型时
我需要能够创建一个有20多个选择题的测验型应用程序 我有三种模式:Python <;类别>;没有指向<;的外键;类别>;在Django中尝试内联模型时,python,django,django-admin,Python,Django,Django Admin,我需要能够创建一个有20多个选择题的测验型应用程序 我有三种模式:测验,问题,和答案 我想在管理界面中创建一个测验,并内联测验和答案元素 目标是单击“添加测验”,然后转到一个包含20个问题字段的页面,每个问题字段有4个答案字段 以下是我目前拥有的: class Quiz(models.Model): label = models.CharField(blank=true, max_length=50) class Question(models.Model): label =
测验
,问题
,和答案
我想在管理界面中创建一个测验,并内联测验和答案元素
目标是单击“添加测验”,然后转到一个包含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'>
class'quizzer.quick.models.Answer'>没有外键
这是可行的,还是我试图从Django管理应用程序中提取太多 正确:试图从管理应用中提取太多内容:)内联模型需要父模型的外键。让我们一步一步地完成 错误:“答案没有可测试的FK” 没错。答案模型没有可测试的FK。它有一个FK问题,但不是测验 为什么答案需要一个FK来测验 提问者有一个回答和一个问题。管理员要有内联,这意味着内联模型(答案和问题)必须与父管理员有FK 让我们检查一下。这个问题有一个FK要测试 和。答案没有可测试的FK。所以你的测验管理员要求你的模型缺少一个FK。这就是错误所在 你不能在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是没有意义的(除非这些模型具有自引用外键)。而且奎扎德明不能在线回答,因为答案并没有外键
如果Django确实支持嵌套的内联线,那么逻辑语法将是QuestionInline接受一个“inlines”属性,您将该属性设置为[AnswerInline]。但事实并非如此
另外请注意,“额外=20”意味着每次加载测验时,在每个测验的底部都会有20个空白问题表单(即使已经有20个实际问题)。也许这正是你想要的——让你的页面很长,但同时也让你很容易添加很多问题