Pergunta

Eu preciso ser capaz de criar um aplicativo do tipo quiz com 20 algumas questões de múltipla escolha ímpares.

Eu tenho 3 modelos: Quizzes, Questions e Answers.

Eu quero na interface de administração para criar um quiz, e in-line os elementos do questionário e respostas.

O objetivo é clicar em "Adicionar Quiz", e ser transferido para uma página com 20 campos de interrogação, com 4 campos de resposta por cada um no lugar.

Aqui está o que eu tenho atualmente:

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)

Eu recebo o seguinte erro quando eu tento adicionar um quiz:

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

É este factível, ou estou tentando puxar muito fora do aplicativo Django administrador?

Foi útil?

Solução

Você não pode fazer "aninhados" inlines no admin (ou seja, você pode' t ter um quiz com perguntas em linha, com cada pergunta em linha tendo Respostas inline). Então você vai precisar para diminuir suas vistas para ter apenas perguntas inline (em seguida, se você navegar para ver uma única pergunta, poderia ter Respostas inline).

Assim, seus modelos são bons, mas o seu código de administrador deve ficar assim:

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]

Não faz sentido para AnswerAdmin ter uma AnswerInline, ou QuestionAdmin ter um QuestionInline (a menos que estes eram modelos com uma chave estrangeira auto-referencial). E QuizAdmin não pode ter um AnswerInline, porque Resposta não tem chave estrangeira para Quiz.

Se Django fez suporte inlines aninhadas, a sintaxe lógica seria para QuestionInline para aceitar um atributo "inlines", que você deve definir para [AnswerInline]. Mas isso não acontece.

Além disso, note que "extra = 20" significa que você terá 20 formas questão em branco na parte inferior de cada questionário, cada vez que você carregá-lo (mesmo que já tem 20 perguntas reais). Talvez seja isso que você quer -. Contribui para uma página longa, mas faz com que seja fácil de adicionar um monte de perguntas de uma só vez

Outras dicas

Vamos seguir passo a passo.

O erro:. "Resposta não tem FK para Quiz"

Isso é correto. O modelo de resposta não tem FK para Quiz. Ele tem uma FK à pergunta, mas não Quiz.

Por que a Resposta necessidade de uma FK para teste?

O QuizAdmin tem uma AnswerInline e uma QuestionInline. Para um administrador de ter inlines, isso significa que os modelos inlined (Resposta e pergunta) deve ter FK para o administrador pai.

Vamos cheque. Pergunta tem uma FK para Quiz.

E. Resposta não tem FK para Quiz. Portanto, o seu administrador Teste exige uma FK que o seu modelo não tem. Esse é o erro.

Correto:. Tentando puxar muito fora da aplicação de administração :) modelos in-line precisa de uma chave estrangeira para o modelo de pai

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top