2009-03-04 66 views
6

我需要能够创建一个20个一些奇怪的选择题的测验类型的应用程序。我有3个型号:Quizzes,QuestionsAnswers。我有3个型号:,QuestionsAnswers。我有3个型号:,QuestionsAnswers<class> Django中没有外键<class>当试图内联模型

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

目标是点击“添加测验”,并转移到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管理员应用程序?

回答

14

您不能在Django管理员中执行"nested" inlines(即您不能在内嵌问题中进行测验,并且每个内联问题都有内联答案)。所以你需要将你的视线降低到只是内嵌问题(如果你导航查看单个问题,它可以有内联答案)。

所以您的模型都很好,但你的管理员代码看起来应该是这样:

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接受您设置为[AnswerInline]的“内联”属性。但事实并非如此。

另外请注意,“extra = 20”表示每次测验底部会有20个空白问题表单,每次加载时(即使它已经有20个实际问题)。也许这就是你想要的 - 让一个长页面,但很容易一次添加很多问题。

2

正确:试图拉太多管理应用程序:)内联模型需要父模型的外键。

3

让我们一步步地进行。

错误:“答案没有FK测验”。

这是正确的。答案模型没有FK来测验。它有问题的FK,但不是测验。

为什么Answer需要FK来测验?

QuizAdmin有一个AnswerInline和一个QuestionInline。要让管理员拥有内联,这意味着内联模型(答案和问题)必须对父管理员具有FK。

让我们来看看。问题有测验的FK。

而且。答案没有FK来测验。所以你的测验管理员需要一个你的模型缺乏的FK。这是错误。