2009-03-04 12 views
6

Ich muss in der Lage sein, eine Quiz-Anwendung mit 20 einige ungerade Multiple-Choice-Fragen zu erstellen.<class> hat keine Fremdschlüssel zu <class> in Django beim Versuch, Inline-Modelle

Ich habe 3 Modelle: Quizzes, Questions und Answers.

Ich möchte in der Admin-Oberfläche ein Quiz erstellen, und die Quiz-und Antwort-Elemente inline.

Ziel ist es, auf "Add Quiz" zu klicken und auf eine Seite mit 20 Fragefeldern mit jeweils 4 Antwortfeldern zu übertragen.

Hier ist, was ich habe zur Zeit:

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) 

ich folgende Fehlermeldung erhalten, wenn ich versuche, ein Quiz hinzuzufügen:

class 'quizzer.quiz.models.Answer'> has no ForeignKey to <class 'quizzer.quiz.models.Quiz'> 

Ist das machbar, oder versuche ich zu viel heraus zu ziehen der Django Admin App?

Antwort

14

Sie können nicht "nested" inlines in der Django-Admin (d. H. Sie können kein Quiz mit Inline-Fragen, mit jeder Inline-Frage mit Inline-Antworten haben). Sie müssen also Ihre Sicht auf die Inline-Fragen reduzieren (wenn Sie dann eine einzelne Frage anzeigen, kann es Inline-Antworten geben).

So Ihre Modelle sind in Ordnung, aber Ihr Admin-Code sollte wie folgt aussehen:

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] 

Es macht keinen Sinn für AnswerAdmin eine AnswerInline haben oder QuestionAdmin eine QuestionInline zu haben (es sei denn, diese Modelle waren mit einem selbstreferentiellen Fremdschlüssel). Und QuizAdmin kann kein AnswerInline haben, weil Answer keinen Fremdschlüssel zum Quiz hat.

Wenn Django verschachtelte Inlines unterstützte, würde die logische Syntax für QuestionInline ein "inlines" -Attribut akzeptieren, das Sie auf [AnswerInline] setzen würden. Aber das tut es nicht.

Beachten Sie auch, dass "extra = 20" bedeutet, dass Sie 20 leere Frageformulare am Ende jedes Quiz haben, jedes Mal wenn Sie es laden (auch wenn es bereits 20 aktuelle Fragen hat).Vielleicht ist es das, was du willst - macht eine lange Seite, aber es macht es einfach, viele Fragen auf einmal hinzuzufügen.

2

Korrekt: versuchen, zu viel aus der Admin-App zu ziehen :) Inline-Modelle benötigen einen Fremdschlüssel zum übergeordneten Modell.

3

Folgen wir Schritt für Schritt.

Der Fehler: "Antwort hat keine FK zu Quiz".

Das ist richtig. Das Antwortmodell hat kein FK zu Quiz. Es hat einen FK zu Frage, aber kein Quiz.

Warum benötigt Antwort eine FK zum Quiz?

Der QuizAdmin hat eine AnswerInline und eine QuestionInline. Damit ein Administrator Inlines hat, bedeutet dies, dass die Inlined-Modelle (Antwort und Frage) FKs zum übergeordneten Admin haben müssen.

Lassen Sie uns überprüfen. Frage hat ein FK zu Quiz.

Und. Antwort hat kein FK zum Quiz. Daher fordert dein Quiz-Administrator einen FK, den dein Modell nicht hat. Das ist der Fehler.

Verwandte Themen