2009-03-04 9 views
6

मुझे कुछ विषम एकाधिक विकल्प प्रश्नों के साथ एक प्रश्नोत्तरी प्रकार एप्लिकेशन बनाने में सक्षम होना चाहिए।<class> में मॉडल को इनलाइन करने की कोशिश करते समय Django में <class> पर कोई विदेशी कुंजी नहीं है

मेरे पास 3 मॉडल हैं: Quizzes, Questions, और Answers

मैं एक प्रश्नोत्तरी बनाने के लिए व्यवस्थापक इंटरफ़ेस में चाहता हूं, और प्रश्नोत्तरी और उत्तर तत्वों को रेखांकित करता हूं।

लक्ष्य "प्रश्नोत्तरी जोड़ें" पर क्लिक करना है, और 20 प्रश्न फ़ील्ड वाले पृष्ठ पर स्थानांतरित किया जाना चाहिए, प्रत्येक स्थान पर 4 उत्तर फ़ील्ड के साथ।

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 व्यवस्थापक ऐप का?

उत्तर

14

आप Django व्यवस्थापक में "nested" inlines नहीं कर सकते हैं (यानी आप इनलाइन प्रश्नों के साथ प्रश्नोत्तरी नहीं कर सकते हैं, प्रत्येक इनलाइन प्रश्न के साथ इनलाइन जवाब हैं)। तो आपको केवल इनलाइन प्रश्नों के लिए अपनी जगहें कम करने की आवश्यकता होगी (फिर यदि आप एक प्रश्न देखने के लिए नेविगेट करते हैं, तो इसमें इनलाइन जवाब हो सकते हैं)।

तो अपने मॉडल ठीक हैं, लेकिन अपने व्यवस्थापक कोड इस तरह दिखना चाहिए:

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 में उत्तर इनलाइन नहीं हो सकती है, क्योंकि उत्तर में क्विज़ की कोई विदेशी कुंजी नहीं है।

यदि डैंजो ने नेस्टेड इनलाइन का समर्थन किया है, तो लॉजिकल सिंटैक्स "इनलाइन" विशेषता को स्वीकार करने के लिए QuestionInline के लिए होगा, जिसे आप [AnswerInline] पर सेट करेंगे। लेकिन ऐसा नहीं है।

यह भी ध्यान दें कि "अतिरिक्त = 20" का अर्थ है कि प्रत्येक क्विज़ के नीचे आपके पास 20 रिक्त प्रश्न फ़ॉर्म होंगे, हर बार जब आप इसे लोड करेंगे (भले ही उसके पास पहले से 20 वास्तविक प्रश्न हों)।हो सकता है कि आप यही चाहते हैं - एक लंबे पृष्ठ के लिए बनाता है, लेकिन एक बार में कई प्रश्नों को जोड़ना आसान बनाता है।

2

सही: व्यवस्थापक ऐप से बहुत अधिक खींचने की कोशिश कर रहा है :) इनलाइन मॉडल को मूल मॉडल के लिए एक विदेशी कुंजी की आवश्यकता है।

3

चलो चरण-दर-चरण का पालन करें।

त्रुटि: "उत्तर में क्विज़ के लिए कोई एफके नहीं है"।

यह सही है। उत्तर मॉडल में क्विज़ के लिए कोई एफके नहीं है। इसमें प्रश्न के लिए एफके है, लेकिन क्विज़ नहीं।

उत्तर को प्रश्नोत्तरी के लिए एफके की आवश्यकता क्यों है?

क्विज़एडमिन में एक उत्तरइनलाइन और एक प्रश्नइनलाइन है। व्यवस्थापक के लिए इनलाइन होने के लिए, इसका मतलब है कि रेखांकित मॉडल (उत्तर और प्रश्न) में एफके का मूल व्यवस्थापक होना चाहिए।

चलिए जांचें। प्रश्नोत्तरी प्रश्नोत्तरी में एफके है।

और। प्रश्नोत्तरी में कोई एफके नहीं है। तो आपका प्रश्नोत्तरी व्यवस्थापक एक एफके की मांग करता है जिसमें आपके मॉडल की कमी है। यह त्रुटि है।

संबंधित मुद्दे