모델을 인라인하려고 할 때 Django에서 에 대한 외국 키가 없습니다.

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

  •  03-07-2019
  •  | 
  •  

문제

20 가지 이상한 객관식 질문이있는 퀴즈 유형 애플리케이션을 만들 수 있어야합니다.

3 가지 모델이 있습니다. Quizzes, Questions, 그리고 Answers.

관리자 인터페이스에서 퀴즈를 만들고 퀴즈와 답변 요소를 인라인으로 만들고 싶습니다.

목표는 "퀴즈 추가"를 클릭하고 20 개의 질문 필드가있는 페이지로 전송되는 것입니다.

내가 현재 가지고있는 것은 다음과 같습니다.

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)

퀴즈를 추가하려고 할 때 다음과 같은 오류가 발생합니다.

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

이것은 가능합니까, 아니면 Django Admin 앱에서 너무 많이 꺼내려고합니까?

도움이 되었습니까?

해결책

당신은 할 수 없습니다 "중첩"인라인 Django 관리자에서 (즉, 인라인 질문에 인라인 질문에 퀴즈를 가질 수는 없으며, 각 인라인 질문에 인라인 답변이 있습니다). 따라서 인라인 질문만으로도 시력을 낮추어야합니다 (그런 다음 단일 질문을 보려면 탐색하면 인라인 답변이있을 수 있습니다).

따라서 모델은 괜찮지 만 관리자 코드는 다음과 같습니다.

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]

answeradmin이 answerInline 또는 QuestionAdmin이 QuestionInline을 갖는 것이 합리적이지 않습니다 (자체 참조 외국 키가있는 모델이 아니라면). 그리고 Quizadmin은 답변을 가질 수 없습니다. 답변에는 퀴즈에 대한 외국 키가 없기 때문입니다.

Django가 중첩 된 인라인을 지원했다면, 논리 구문은 Questioninline이 "Inlines"속성을 수락하는 것이며 [answerinline]으로 설정했습니다. 그러나 그렇지 않습니다.

또한 "extra = 20"은 모든 퀴즈의 맨 아래에 20 개의 빈 질문 양식이있을 때마다 (실제 20 개의 실제 질문이 있더라도) 20 개의 빈 질문 양식이 있음을 의미합니다. 어쩌면 그것은 당신이 원하는 것일 수도 있습니다 - 긴 페이지를 만들지 만 한 번에 많은 질문을 쉽게 추가 할 수 있습니다.

다른 팁

단계별로 따라 갑시다.

오류 : "답변은 퀴즈에 FK가 없습니다".

맞습니다. 답변 모델에는 퀴즈에 FK가 없습니다. 질문 할 FK가 있지만 퀴즈는 없습니다.

답변이 퀴즈에 FK가 필요한 이유는 무엇입니까?

Quizadmin에는 답변과 질문이 있습니다. 관리자가 인라인을 갖기 위해서는 상감 모델 (답변 및 질문)이 부모 관리자에게 FK를 가져야한다는 것을 의미합니다.

점검 해보자. 질문에는 FK가 퀴즈가 있습니다.

그리고. 답변에는 퀴즈에 FK가 없습니다. 따라서 퀴즈 관리자에게는 모델이 부족한 FK가 필요합니다. 그게 오류입니다.

올바른 : 관리 앱을 너무 많이 끌어 내려고 시도합니다 :) 인라인 모델에는 부모 모델에 대한 외국 키가 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top