2009-03-04 65 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。這是錯誤。