2009-03-04 15 views
6

私はいくつかの奇数多項選択問題を持つクイズタイプのアプリケーションを作成する必要があります。<class>はDjangoの<class>への外部キーがありません

私には、Quizzes,QuestionsAnswersという3つのモデルがあります。

私は管理インタフェースでクイズを作成し、クイズとアンサー要素をインライン化したいと考えています。

「クイズの追加」をクリックして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を実行することはできません。つまり、インライン質問を含むクイズは作成できません。それぞれのインライン質問にはインライン回答があります。だから、インラインの質問だけにあなたの見解を下げる必要があります(1つの質問を表示するために移動すると、インラインの回答が得られる可能性があります)。

は、だからあなたのモデルは罰金ですが、あなたの管理者コードは次のようになります。

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]に設定する "inlines"属性を受け入れることになります。しかし、それはしません。

また、「余分な= 20」というのは、各クイズの下部に20個の空白の質問フォームが表示されることを意味します(すでに20個の実際の質問がある場合でも)。たぶんそれはあなたが望むものなのかもしれません。長いページを作るのですが、一度にたくさんの質問を追加するのは簡単です。

2

正しい:管理アプリからあまりにも多くを引き出しようとしています:)インラインモデルでは、親モデルに外部キーが必要です。

3

手順を順を追って説明します。

エラー:「回答にはクイズにFKがありません」。

これは間違いありません。 AnswerモデルにはFK to Quizはありません。クイズではなくFKで質問します。

答えにクイズにFKが必要なのはなぜですか?

QuizAdminにはAnswerInlineとQuestionInlineがあります。管理者がインラインを持つためには、インラインモデル(回答と質問)に親管理者にFKが必要であることを意味します。

を確認してください。質問にはFK to Quizがあります。

そして。答えはクイズにFKがありません。あなたのクイズ管理者はあなたのモデルに欠けているFKを要求します。それは誤りです。

関連する問題