2009-03-04 10 views
6

Necesito poder crear una aplicación de cuestionario con 20 preguntas impares de opción múltiple.<class> no tiene una clave externa a <class> en Django al intentar alinear los modelos

Tengo 3 modelos: Quizzes, Questions y Answers.

que quiero en la interfaz de administración para crear un cuestionario, en línea y de la prueba y responder a los elementos.

El objetivo es hacer clic en "Agregar cuestionario" y transferirlo a una página con 20 campos de preguntas, con 4 campos de respuesta por cada uno en su lugar.

Aquí es lo que tengo actualmente:

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) 

me sale el siguiente error al intentar añadir un cuestionario:

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

¿Este factible, o estoy tratando de tirar demasiado fuera de la aplicación de administración de Django?

Respuesta

14

No puede hacer "nested" inlines en el administrador de Django (es decir, no puede tener una prueba con preguntas en línea, con cada pregunta en línea con respuestas en línea). Por lo tanto, tendrá que bajar la vista hasta tener preguntas en línea (luego, si navega para ver una sola pregunta, podría tener respuestas en línea).

Así que sus modelos están muy bien, pero su clave de administrador debe tener este aspecto:

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] 

No tiene sentido para AnswerAdmin tener una AnswerInline o QuestionAdmin tener un QuestionInline (a menos que éstos eran los modelos con una clave externa autorreferencial). Y QuizAdmin no puede tener una AnswerInline, porque Answer no tiene una clave foránea para Quiz.

Si Django admitía líneas anidadas, la sintaxis lógica sería que QuestionInline aceptara un atributo "en línea", que establecería en [AnswerInline]. Pero no es así

También tenga en cuenta que "extra = 20" significa que tendrá 20 formularios de preguntas en blanco en la parte inferior de cada cuestionario, cada vez que lo cargue (incluso si ya tiene 20 preguntas reales).Tal vez eso es lo que quiere: hace una página larga, pero hace que sea fácil agregar muchas preguntas a la vez.

2

correcta: tratar de tirar demasiado de aplicación de administración :) modelos Inline necesitan una clave externa al modelo de los padres.

3

Vamos a seguir paso a paso.

Error: "La respuesta no tiene FK al cuestionario".

Eso es correcto. El modelo de respuesta no tiene FK para la prueba. Tiene un FK para preguntar, pero no un cuestionario.

¿Por qué Answer necesita un FK en el cuestionario?

El QuizAdmin tiene una AnswerInline y una QuestionInline. Para que un administrador tenga en línea, significa que los modelos en línea (Respuesta y Pregunta) deben tener FK para el administrador principal.

Vamos a verificar. La pregunta tiene un FK para la prueba.

Y. La respuesta no tiene FK para la prueba. Por lo tanto, el administrador de su prueba exige un FK que su modelo no tiene. Ese es el error.

Cuestiones relacionadas