2009-12-18 4 views
77

मेरी स्थानीय मशीन पाइथन 2.5 और निगेंक्स को उबंटू 8.10 पर चल रही है, जिसमें डैंजो ने नवीनतम विकास ट्रंक से बनाया है।Django TemplateDoesNotExist?

हर यूआरएल मेरा अनुरोध है के लिए, यह फेंकता है:

 
TemplateDoesNotExist at /appname/path 
appname/template_name.html 

Django tried loading these templates, in this order: 
* Using loader django.template.loaders.filesystem.function: 
* Using loader django.template.loaders.app_directories.function: 

TEMPLATE_DIRS ('/usr/lib/python2.5/site-packages/projectname/templates',) 

यह इस मामले में /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html की तलाश है? अजीब चीज यह फ़ाइल डिस्क पर मौजूद है। Django इसे क्यों नहीं ढूँढ सकता?

मैं उसी समस्या को बिना किसी समस्या के उबंटू 9.04 पर पाइथन 2.6 के साथ रिमोट सर्वर पर चलाता हूं। अन्य सेटिंग्स एक ही हैं।

क्या मेरी स्थानीय मशीन पर कुछ भी गलत कॉन्फ़िगर किया गया है, या संभवतः ऐसी त्रुटियों के कारण क्या हो सकता है जो मुझे देखना चाहिए?

मेरी settings.py में, मैं निर्दिष्ट किए हैं:

SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__)) 
# Find templates in the same folder as settings.py. 
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'), 
) 

यह निम्न फ़ाइलें

 
/usr/lib/python2.5/site-packages/projectname/templates/appname1/template1.html 
/usr/lib/python2.5/site-packages/projectname/templates/appname1/template2.html 
/usr/lib/python2.5/site-packages/projectname/templates/appname2/template3.html 
... 

उपरोक्त सभी फ़ाइलें डिस्क पर मौजूद हैं के लिए विचार करना shoule।

हल

अब यह काम करता है के बाद मैंने कोशिश की chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

यह अजीब है। मुझे इसे काम करने के लिए रिमोट सर्वर पर ऐसा करने की आवश्यकता नहीं है।

+0

क्या आपका TEMPLATE_DIRS वेबसर्वर द्वारा पठनीय है? –

+0

@ जोर्डन, रूट द्वारा पहुंच योग्य TEMPLATE_DIRS पर्याप्त है। यह वही है जो इसे दूरस्थ सर्वर पर कॉन्फ़िगर किया गया है जो काम कर रहा है। – jack

उत्तर

112

पहले समाधान:

ये सेटिंग्स

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'), 
) 

मतलब है कि Django अपनी परियोजना के तहत templates/ निर्देशिका से टेम्पलेट्स पर दिखेगा।

मानते हुए अपने Django परियोजना तो /usr/lib/python2.5/site-packages/projectname/ पर स्थित है अपनी सेटिंग्स django के साथ तो उस मामले में हम अपने टेम्पलेट्स ले जाना चाहते हैं इस तरह बनाया जाता है करने के लिए /usr/lib/python2.5/site-packages/projectname/templates/

तहत टेम्पलेट्स के लिए दिखेगा:

/usr/lib/python2.5/site-packages/projectname/templates/template1.html 
/usr/lib/python2.5/site-packages/projectname/templates/template2.html 
/usr/lib/python2.5/site-packages/projectname/templates/template3.html 

दूसरा समाधान:

यदि यह अभी भी काम नहीं करता है और यह मानता है कि आपके पास सेटिंग.py में कॉन्फ़िगर किए गए ऐप्स हैं:

INSTALLED_APPS = (
    'appname1', 
    'appname2', 
    'appname3', 
) 

डिफ़ॉल्ट Django तक हर इंस्टॉल किए गए एप्लिकेशन के तहत templates/ निर्देशिका के अंतर्गत टेम्पलेट्स लोड होगा।तो आपकी निर्देशिका संरचना के साथ, हम अपने टेम्पलेट्स को इस तरह से स्थानांतरित करना चाहते हैं:

/usr/lib/python2.5/site-packages/projectname/appname1/templates/template1.html 
/usr/lib/python2.5/site-packages/projectname/appname2/templates/template2.html 
/usr/lib/python2.5/site-packages/projectname/appname3/templates/template3.html 

आशा है कि मदद करता है।

SETTINGS_PATH डिफ़ॉल्ट रूप से परिभाषित नहीं किया जा सकता है। जो मामले में, आप इसे परिभाषित करने की (settings.py में) चाहते हैं: टेम्पलेट्स और APPNAME निर्देशिकाओं पर

import os 
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)) 
+1

@jpartogi, मैंने दोनों दृष्टिकोणों की कोशिश की लेकिन न तो काम करता है। मैंने render_to_response() तर्क में टेम्पलेट के पूर्ण पथ का उपयोग करने का भी प्रयास किया लेकिन अभी भी काम नहीं किया। – jack

+0

क्या आपका django प्रोजेक्ट '/ usr/lib/python2.5/साइट-पैकेज/प्रोजेक्टनाम /' के अंतर्गत है? –

+0

@jpartogi, हां, सभी स्थापित ऐप्स /usr/lib/python2.5/site-packages/projectname/appname1 के अंतर्गत हैं, ... – jack

3

बस एक झटका, लेकिन this article on Django template loading देखें। विशेष रूप से, सुनिश्चित करें कि आपके TEMPLATE_LOADERS सूची में django.template.loaders.app_directories.Loader है।

+0

यह मेरे लिए काम किया। फाइल सिस्टम पर Django ऐप्स से टेम्पलेट लोड करता है। INSTALLED_APPS में प्रत्येक ऐप के लिए, लोडर एक टेम्पलेट उपनिर्देशिका की तलाश करता है। यदि निर्देशिका मौजूद है, तो Django वहां टेम्पलेट्स की तलाश में है।
टेम्पलेट्स = [{ 'बैकेंड': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': सही, }] – Vijay

0

जांचें कि आपके templates.html /usr/lib/python2.5/site-packages/projectname/templates dir में हैं।

4

चेक अनुमतियाँ, या तो ls -l या Django से खुला एक पूर्ण पथ() करने का प्रयास करें साथ।

4

अब यह काम करता है के बाद मैं

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/* 

यह अजीब है की कोशिश की। मुझे इसे काम करने के लिए रिमोट सर्वर पर ऐसा करने की ज़रूरत नहीं है।

इसके अलावा, मुझे सभी स्थिर फ़ाइलों को एक्सेस करने योग्य बनाने के लिए स्थानीय मशीन पर निम्न आदेश चलाने के लिए है, लेकिन दूरस्थ सर्वर पर वे सभी "रूट: रूट" हैं।

chown -R www-data:www-data /var/www/projectname/* 

स्थानीय मशीन उबंटू 8.04 डेस्कटॉप संस्करण पर चलती है। रिमोट सर्वर उबंटू 9.04 सर्वर संस्करण पर है।

कोई भी जानता है क्यों?

3

Django TemplateDoesNotExist त्रुटि का अर्थ है कि फ्रेमवर्क टेम्पलेट फ़ाइल नहीं ढूंढ सकता है।

टेम्पलेट लोडिंग एपीआई का उपयोग करने के लिए, आपको उस फ्रेमवर्क को बताना होगा जहां आप अपने टेम्पलेट्स को स्टोर करते हैं। ऐसा करने के लिए स्थान TEMPLATE_DIRS सेटिंग द्वारा आपकी सेटिंग्स फ़ाइल (settings.py) में है। डिफ़ॉल्ट रूप से यह एक खाली टुपल है, इसलिए यह सेटिंग Django के टेम्पलेट-लोडिंग तंत्र को बताती है जहां टेम्पलेट्स को देखना है।

एक निर्देशिका है जहाँ आप अपने टेम्पलेट की दुकान और TEMPLATE_DIRS में जोड़ने के लिए करना चाहते हैं उठाओ जैसे:

TEMPLATE_DIRS = (
    '/home/django/myproject/templates', 
) 
+1

नहीं है ओएमजी मैं विश्वास नहीं कर सकता कि यह काम करता है, आप बहुत अजीब हैं। –

27

इस टपल खोजें:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

आप करने के लिए 'DIRS' जोड़ने की जरूरत स्ट्रिंग

"os.path.join(SETTINGS_PATH, 'templates')" 

तो पूरी तरह आप की जरूरत:

+०१२३५१६४१०
TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(SETTINGS_PATH, 'templates')], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 
+13

'SETTINGS_PATH' वास्तव में कहीं भी परिभाषित नहीं किया गया है, इसलिए मुझे नहीं लगता कि यह जवाब काम करेगा। शायद आपका मतलब है 'BASE_DIR' – sofly

6

.py स्थापित करने में TEMPLATE_LOADERS हटाने और खाका DIRS फिर जोड़ें

TEMPLATES = [ 
{ 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': ['/home/jay/apijay/templates',], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      'django.template.context_processors.debug', 
      'django.template.context_processors.request', 
      'django.contrib.auth.context_processors.auth', 
      'django.contrib.messages.context_processors.messages', 
     ], 
    }, 
}, 
] 
+1

धन्यवाद!' डीआईआरएस 'के पथ को पूरी तरह से काम करना । – Shilpa

1

Django संस्करण 1.9 के लिए, मैं

'DIRS': [os.path.join(BASE_DIR, 'templates')], 

लाइन जोड़ा टेम्पलेट्स के लिए सेटिंग्स में ब्लॉक।py और यह काम किया अच्छी तरह से

0

देखें जो फ़ोल्डर Django त्रुटि पृष्ठ में Template-loader postmortem पर टेम्पलेट नज़र लोड करने का प्रयास, उदाहरण के लिए, त्रुटि इस तरह sothing देगा:

Template-loader postmortem 

Django tried loading these templates, in this order: 

Using engine django: 
django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist) 

रास्ते में मेरी त्रुटि में vcsrc\vcsrc\templates\base.html नहीं।
फिर अपने टेम्पलेट्स पथ के लिए setting.pyTEMPLATES में फ़ाइल बदलने

TEMPLATES = [ 
    {  
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     # 'DIRS': [], 
     'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
     ... 
-2

हाय लोग मैं एक नया समाधान नहीं मिला। दरअसल इसे किसी अन्य टेम्पलेट में परिभाषित किया जाता है ताकि स्वयं TEMPLATE_DIRS को परिभाषित करने के बजाय, अपनी निर्देशिका पथ का नाम उनके पर रखें: enter image description here