2010-12-07 9 views
26

विफल रहता है जब मैं Django खोल का उपयोग करता हूं, यह एक त्रुटि दिखाता है; यह त्रुटि है:Django खोल में एक मॉडल वर्ग को परिभाषित करने में

>>> from django.db import models 
>>> class Poll(models.Model): 
...  question = models.CharField(max_length=200) 
...  pub_date = models.DateTimeField('date published') 
... 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "D:\Python25\lib\site-packages\django\db\models\base.py", line 51, in __new__ 
    kwargs = {"app_label": model_module.__name__.split('.')[-2]} 
IndexError: list index out of range 

मैं क्या कर सकता हूं?

+0

इसी तरह के मुद्दों पर चर्चा की गई: http://stackoverflow.com/questions/2215403/exception-when-trying-to-install-django-treebeard-based-on-instructions – pyfunc

+0

उस स्थान पर model_module .__ name__ को प्रिंट करने का प्रयास करें। । – pyfunc

उत्तर

44

मॉडल परिभाषा एक आवेदन में आना चाहिए - त्रुटि आप देख रहे हैं नहीं है कि यह लेने की कोशिश करता __name__model_module - जो project\appname\models.py के लिए project.appname.models की तरह कुछ होना चाहिए - और ऐप्लिकेशन का नाम, appname मिलता है। इंटरैक्टिव कंसोल में, मॉड्यूल का __name__'__main__' है - इसलिए यह विफल हो जाता है।

इसके आसपास जाने के लिए, आपको app_label स्वयं Meta कक्षा में निर्दिष्ट करना होगा;

>>> from django.db import models 
>>> class Poll(models.Model): 
...  question = models.CharField(max_length=200) 
...  pub_date = models.DateTimeField('date published') 
...  class Meta: 
...   app_label = 'test' 

आप ऐसा कर सकते क्यों, उस फ़ाइल ट्रैस बैक में उल्लेख किया है पर देखने के स्पष्टीकरण के लिए, D:\Python25\lib\site-packages\django\db\models\base.py:

if getattr(meta, 'app_label', None) is None: 
     # Figure out the app_label by looking one level up. 
     # For 'django.contrib.sites.models', this would be 'sites'. 
     model_module = sys.modules[new_class.__module__] 
     kwargs = {"app_label": model_module.__name__.split('.')[-2]} 
    else: 
     kwargs = {} 

(कहाँ metaMeta वर्ग है, बस ऊपर उस फ़ाइल में देखते हैं।)

+0

हाय @ क्रिस, मेरे ऐप का नाम "task2" है, इसलिए मुझे app_label = 'task2' लिखना चाहिए, हां? – zjm1126

+4

@ zjm1126: हाँ, वह करेगा। यह देखते हुए कि यह इंटरैक्टिव कंसोल में है, यह वास्तव में कोई फर्क नहीं पड़ता; मुझे लगता है कि आप किसी कारण से मॉडल के साथ बस गड़बड़ कर रहे हैं - यदि आप 'टास्क 2' में क्या उपयोग करना चाहते हैं, तो आपको 'task2.models आयात पोल' का उपयोग करना चाहिए। –

0

यह अन्य उत्तर निश्चित रूप से इंटरैक्टिव प्रॉम्प्ट के लिए काम करता है, हालांकि, मुझे नहीं लगता कि कोड के पहले ब्लॉक का इरादा वास्तव में चलाने के लिए किया गया था। the models documentation में उस कोड का तत्काल अनुसरण करने के बाद, आपको अगले कोडों को पिछले मॉड्यूल फ़ाइल में बनाए गए आपके मॉड्यूल फ़ाइल में रखने की उम्मीद है ... मुझे लगता है कि उन्होंने उस अनुभाग को "त्वरित उदाहरण" लेबल किया है। मेरे लिए भी सिरदर्द क्या है!

+0

फ़्यूथरमोर, यह पैराग्राफ कहता है कि "उपर्युक्त व्यक्ति मॉडल डेटाबेस डेटाबेस बना देगा ..." यह सुझाव देता है कि यह वास्तव में कभी भी चलाने के इरादे से नहीं था। –

0

मैं ग्रहण, Django और PyDev का उपयोग कर इस समस्या में भाग गया। मुझे ठीक से काम करने के लिए सब कुछ चलाने के लिए क्लिक करने से पहले PyDev पैकेज एक्सप्लोरर (बाएं पैनल) में चयनित एप्लिकेशन (उदाहरण के लिए कुछ .py फ़ाइल के बजाय) की आवश्यकता थी।

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