< classe > n'a pas de clé étrangère vers < class > dans Django en essayant de modèles inline

StackOverflow https://stackoverflow.com/questions/609556

  •  03-07-2019
  •  | 
  •  

Question

Je dois être capable de créer une application de type quiz avec une vingtaine de questions à choix multiples et étranges.

J'ai 3 modèles: Quiz , Questions et Réponses .

Je souhaite créer un questionnaire dans l'interface d'administration et y intégrer les éléments quiz et répondre.

L'objectif est de cliquer sur "Ajouter un questionnaire" et d'être transféré sur une page comportant 20 champs de question, avec 4 champs de réponse pour chaque élément 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)

L'erreur suivante s'affiche lorsque j'essaie d'ajouter un questionnaire:

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

Est-ce faisable ou est-ce que j'essaie de tirer trop de choses de l'application Django Admin?

Était-ce utile?

La solution

Vous ne pouvez pas faire " nested " inlines dans l’administrateur de Django (c’est-à-dire que vous ne pouvez pas avoir un quiz avec des questions en ligne, chaque question en ligne ayant des réponses en ligne). Vous devrez donc vous concentrer sur le simple fait de poser des questions en ligne (si vous naviguez pour afficher une seule question, des réponses en ligne pourraient apparaître).

Vos modèles fonctionnent donc bien, mais votre code administrateur doit ressembler à ceci:

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]

Il n’a pas de sens pour AnswerAdmin d’avoir une AnswerInline, ou QuestionAdmin d’avoir une QuestionInline (sauf s’il s’agissait de modèles avec une clé étrangère auto-référentielle). Et QuizAdmin ne peut pas avoir de AnswerInline, car Answer n’a pas de clé étrangère dans Quiz.

Si Django prenait en charge les inlines imbriquées, la syntaxe logique serait que QuestionInline accepte les & inline " attribut, que vous avez défini sur [AnswerInline]. Mais ce n’est pas le cas.

Notez également que " extra = 20 " signifie que vous aurez 20 formulaires de questions vierges au bas de chaque jeu-questionnaire, chaque fois que vous le chargez (même s'il contient déjà 20 questions). C’est peut-être ce que vous voulez - une longue page, mais il est facile d’ajouter beaucoup de questions à la fois.

Autres conseils

Suivons pas à pas.

L'erreur: "La réponse n'a pas de FK en test".

C'est correct. Le modèle de réponse n'a pas de FK à Quiz. Il a un FK à interroger, mais pas un quiz.

Pourquoi Answer a-t-il besoin d'un FK pour interroger?

QuizAdmin a une AnswerInline et une QuestionInline. Pour qu’un administrateur ait des lignes, cela signifie que les modèles en ligne (Réponse et Question) doivent avoir des FK pour l’administrateur parent.

Vérifions. La question a un FK à interroger.

Et. La réponse n'a pas de FK à Quiz. Donc, votre administrateur de quiz demande un FK qui manque à votre modèle. C'est l'erreur.

Correct: essayer de tirer trop de choses de l'application admin :) Les modèles intégrés ont besoin d'une clé étrangère pour le modèle parent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top