모델을 인라인하려고 할 때 Django에서 에 대한 외국 키가 없습니다.
-
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가 필요합니다. 그게 오류입니다.
올바른 : 관리 앱을 너무 많이 끌어 내려고 시도합니다 :) 인라인 모델에는 부모 모델에 대한 외국 키가 필요합니다.