& Lt; classe > non ha una chiave esterna per < class > in Django quando si tenta di incorporare i modelli

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

  •  03-07-2019
  •  | 
  •  

Domanda

Devo essere in grado di creare un'applicazione di tipo quiz con 20 domande a scelta multipla dispari.

Ho 3 modelli: Quiz , Domande e Risposte .

Voglio che nell'interfaccia di amministrazione crei un quiz e inline il quiz e gli elementi di risposta.

L'obiettivo è fare clic su " Aggiungi quiz " ;, ed essere trasferito su una pagina con 20 campi di domanda, con 4 campi di risposta per ciascuno in atto.

Ecco quello che ho attualmente:

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)

Ricevo il seguente errore quando provo ad aggiungere un quiz:

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

È possibile o sto cercando di estrarre troppo dall'app Django Admin?

È stato utile?

Soluzione

Non puoi fare " nested " inline nell'amministratore di Django (ovvero non puoi avere un quiz con domande in linea, con ogni domanda in linea con risposte in linea). Quindi dovrai abbassare la vista per avere solo domande in linea (quindi se navighi per visualizzare una singola domanda, potrebbero avere risposte in linea).

Quindi i tuoi modelli vanno bene, ma il tuo codice amministratore dovrebbe apparire così:

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]

Non ha senso che AnswerAdmin abbia un AnswerInline o QuestionAdmin che abbia un QuestionInline (a meno che non si tratti di modelli con una chiave esterna autoreferenziale). E QuizAdmin non può avere un AnswerInline, perché Answer non ha una chiave esterna per Quiz.

Se Django supportava gli inline nidificati, la sintassi logica sarebbe che QuestionInline accettasse un "inline". attributo, che avresti impostato su [AnswerInline]. Ma non lo è.

Nota anche che " extra = 20 " significa che avrai 20 moduli di domanda vuoti nella parte inferiore di ogni quiz, ogni volta che lo carichi (anche se ha già 20 domande effettive). Forse è quello che vuoi: crea una lunga pagina, ma semplifica l'aggiunta di molte domande contemporaneamente.

Altri suggerimenti

Seguiamo passo per passo.

Errore: " La risposta non ha FK per il quiz " ;.

È corretto. Il modello di risposta non ha FK per il quiz. Ha un FK da interrogare, ma non un quiz.

Perché la risposta ha bisogno di un FK per eseguire il quiz?

QuizAdmin ha un AnswerInline e un QuestionInline. Affinché un amministratore abbia inline, significa che i modelli inline (risposta e domanda) devono avere FK per l'amministratore principale.

Controlliamo. La domanda ha un FK per il quiz.

E. La risposta non ha FK a Quiz. Quindi il tuo amministratore Quiz richiede un FK che manca al tuo modello. Questo è l'errore.

Corretto: tentativo di estrarre troppo dall'app di amministrazione :) I modelli in linea hanno bisogno di una chiave esterna per il modello principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top