<class> n'a pas de clé étrangère à <class> dans Django lors de la tentative de inline modèles
J'ai besoin d'être en mesure de créer un questionnaire type d'application avec 20 de drôles de questions à choix multiples.
J'ai 3 modèles: Quizzes
, Questions
, et Answers
.
Je veux dans l'interface d'administration pour créer un quiz, et en ligne le quiz et des éléments de réponse.
Le but est de cliquer sur "Ajouter un Jeu", et d'être transféré vers une page avec 20 questions les champs, avec 4 champs par chaque en place.
Voici ce que j'ai actuellement:
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)
J'obtiens l'erreur suivante lorsque j'essaie d'ajouter un quiz:
class 'quizzer.quiz.models.Answer'> has no ForeignKey to <class 'quizzer.quiz.models.Quiz'>
Est-ce faisable, ou suis-je en essayant de tirer trop de Django Admin app?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire "imbriqués" inlines dans le Django admin (c'est à dire que vous ne pouvez pas avoir un Questionnaire en ligne des Questions, à chaque inline Question inline Réponses). De sorte que vous aurez besoin de réduire vos sites juste d'avoir inline Questions (alors si vous accédez à une seule Question, il pourrait avoir inline Réponses).
Si vos modèles sont très bien, mais votre admin code devrait ressembler à ceci:
Il ne fait pas de sens pour AnswerAdmin d'avoir un AnswerInline, ou QuestionAdmin d'avoir un QuestionInline (à moins qu'ils étaient des modèles avec un auto-référentielle de clé étrangère). Et QuizAdmin ne pouvez pas avoir un AnswerInline, parce que la Réponse n'a pas de clé étrangère pour Quiz.
Si Django n'soutien imbriquée inlines, la logique de la syntaxe serait pour QuestionInline à accepter un "inlines" attribut, qui de vous mettre à [AnswerInline]. Mais il ne le fait pas.
Notez également que "extra = 20" signifie que vous aurez 20 vide Question des formes à la fin de chaque Quiz, chaque fois que vous chargez (même si elle l'a déjà 20 Questions). C'est peut-être ce que vous voulez - fait pour une longue page, mais il est facile d'ajouter beaucoup de questions à la fois.
Nous allons suivre étape par étape.
L'erreur: "la Réponse n'a pas de FK au Quiz".
C'est correct. Le modèle de Réponse n'a pas de FK à un Questionnaire. Il a un FK à la Question, mais pas de Quiz.
Pourquoi ne Répondre à besoin d'un FK au quiz?
La QuizAdmin a un AnswerInline et un QuestionInline. Pour un admin d'avoir inlines, cela signifie que le inline modèles (questions /Réponses) doit avoir FK pour le parent admin.
Nous allons vérifier. Question a un de la FK au Quiz.
Et. La réponse n'a pas de FK à un Questionnaire. Si votre Quiz admin exige une FK que votre modèle est dépourvu. C'est l'erreur.
Correct: en essayant de tirer trop de admin app 🙂 Inline, les modèles ont besoin d'une clé étrangère pour le modèle parent.