Frage

Ich muss in der Lage, eine Quiz-Typ-Anwendung mit 20 einige ungerade Multiple-Choice-Fragen zu schaffen.

Ich habe 3 Modelle: Quizzes, Questions und Answers.

ich im Admin-Interface soll ein Quiz erstellen, und das Quiz Inline- und Elemente beantworten.

Das Ziel ist, „Add-Quiz“, klicken und mit 20 Frage Feldern mit 4 Antwortfeldern pro jeweils an Ort und Stelle auf einer Seite übertragen werden.

Hier ist, was ich 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 erhalte die folgende Fehlermeldung, 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 aus dem Django Admin App zu viel zu ziehen?

War es hilfreich?

Lösung

Sie können nicht tun "verschachtelt" inlines in Django Admin (dh Sie können‘ t hat ein Quiz mit Inline-Fragen, mit jeder Inline-Frage Inline Antworten hat). So müssen Sie auf Ihre Sehenswürdigkeiten senken nur Inline-Fragen mit (dann, wenn Sie nur eine einzige Frage zu betrachten, navigieren, könnte es Inline-Antworten haben).

So Ihre Modelle sind in Ordnung, aber Ihr Admin-Code soll 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 haben (es sei denn, diese Modelle mit einer selbstbezogenen Fremdschlüssel waren). Und QuizAdmin kann keine AnswerInline haben, weil Antwort keine Fremdschlüssel Quiz hat.

Wenn Django Unterstützung verschachtelter inlines täte, würde die logische Syntax sein für QuestionInline ein „inlines“ -Attribut zu akzeptieren, die Sie auf [AnswerInline] eingestellt hatte. Aber es funktioniert nicht.

Beachten Sie auch, dass „extra = 20“ bedeutet, dass Sie 20 leere Frage bildet sich an der Unterseite jedes Quiz haben werden, jedes Mal wenn es laden (auch wenn es bereits 20 aktuelle Fragen hat). Vielleicht ist das, was Sie wollen -. Sorgt für eine lange Seite, aber macht es einfach, auf einmal viele Fragen hinzufügen

Andere Tipps

Lassen Sie sich durch Schritt für Schritt folgen.

Der Fehler. "Antwort hat keine FK Quiz"

Das ist richtig. Die Antwort-Modell hat keine FK Quiz. Es hat eine FK auf die Frage, aber nicht Quiz.

Warum Antwort muss ein FK-Quiz?

Die QuizAdmin hat eine AnswerInline und QuestionInline. Für ein Admin inlines zu haben, bedeutet dies, die inlined Modelle (Antwort und Frage) FK ist an die Mutter Admin haben.

Lassen Sie uns prüfen. Frage hat eine FK-Quiz.

Und. Antwort hat keine FK Quiz. Also Ihr Quiz Admin verlangt ein FK, dass Ihr Modell fehlt. Das ist der Fehler.

Richtig:. Versuchen, zu viel zu ziehen admin app :) Inline-Modelle benötigen einen Fremdschlüssel auf das übergeordnete Modell

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top