Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python <;类别>;没有指向<;的外键;类别>;在Django中尝试内联模型时_Python_Django_Django Admin - Fatal编程技术网

Python <;类别>;没有指向<;的外键;类别>;在Django中尝试内联模型时

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多个选择题的测验型应用程序

我有三种模式:
测验
问题
,和
答案

我想在管理界面中创建一个测验,并内联测验和答案元素

目标是单击“添加测验”,然后转到一个包含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个实际问题)。也许这正是你想要的——让你的页面很长,但同时也让你很容易添加很多问题