Django TemplateDoesNotExist?


163

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

मेरे द्वारा अनुरोधित प्रत्येक URL के लिए, यह फेंकता है:

TemplateDoesNotExist पर / appname / path appname / template_name.html

Django ने इन टेम्प्लेटों को इस क्रम में लोड करने की कोशिश की: * लोडर django.template.loaders.filesystem.function का उपयोग करना: * लोडर django.template.loaders.app_directories.function का उपयोग करना:

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

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

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

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

मेरी सेटिंग में , मैंने निर्दिष्ट किया है:

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
  • ...

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

हल किया

मेरे प्रयास करने के बाद यह अब काम करता है:

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

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


क्या आपका TEMPLATE_DIRS वेबसर्वर द्वारा पढ़ा जा सकता है?
जॉर्डन मेसीना

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

जवाबों:


196

पहला उपाय :

ये सेटिंग्स

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

दूसरा उपाय :

यदि वह अभी भी काम नहीं करता है और यह मानता है कि आपके पास सेटिंग्स इस तरह सेटिंग्स में कॉन्फ़िगर की गई हैं:

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डिफ़ॉल्ट रूप से परिभाषित नहीं किया जा सकता है। किस स्थिति में, आप इसे परिभाषित करना चाहेंगे (सेटिंग्स में)

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

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

क्या आपकी django परियोजना के तहत है /usr/lib/python2.5/site-packages/projectname/?
यहोशू भागोगी

@jpartogi, हां, सभी इंस्टॉल किए गए एप्लिकेशन /usr/lib/python2.5/site-packages/projectname/appname1 के तहत हैं ...
जैक

क्या आप कृपया अपना मूल पोस्ट संपादित कर सकते हैं और सेटिंग्स को पेस्ट कर सकते हैं। DB विन्यास को छोड़कर: -d। धन्यवाद।
यहोशू भागोगी

हर टेम्पलेट को अलग-अलग ऐप से एक डायरेक्टरी में रखना templatesएक अच्छा डिज़ाइन नहीं है। लेकिन, जैसा कि मैं जानता हूँ कि, अपने को जोड़ने के बाद APP_NAMEमें settings.py, djangoनिर्देशिका के अंतर्गत है, जिसके तहत एप्लिकेशन की टेम्पलेट खोज करने के लिए जा सकते हैं APP_DIR। इस प्रकार, आप विभिन्न ऐप के लिए टेम्पलेट को अलग कर सकते हैं। (Django 1.7 - .1.9
एल्स्टन

59

इस टपल का पता लगाएं:

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

    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',
                ],
            },
        },
    ]

आपको स्ट्रिंग को 'डीआईआरएस' में जोड़ना होगा

"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',
            ],
        },
    },
]

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

1
परिभाषित करें SETTINGS_PATH = os.path.dirname (os.path.dirname ( file ))
Shapon Pal

1
मुझे लगता है कि Shapon Pal का मतलब है SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), फ़ाइल
mic

20

यदि आप एक appखरोंच से जोड़ने पर इस समस्या का सामना करते हैं । यह शायद इसलिए है क्योंकि आप कुछ याद करते हैं settings। जोड़ते समय तीन चरणों की आवश्यकता होती है app

1 、 डायरेक्टरी और टेम्प्लेट फ़ाइल बनाएँ।

मान लीजिए कि आपके पास कोई प्रोजेक्ट है mysiteऔर आप appनाम जोड़ना चाहते हैं your_app_name। अपनी टेम्पलेट फ़ाइल mysite/your_app_name/templates/your_app_nameको निम्नानुसार रखें।

├── mysite
   ├── settings.py
   ├── urls.py
   └── wsgi.py
├── your_app_name
   ├── admin.py
   ├── apps.py
   ├── models.py
   ├── templates
      └── your_app_name
          └── my_index.html
   ├── urls.py
   └── views.py

2 、 अपने appको जोड़ें INSTALLED_APPS

संशोधित settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3, अपने जोड़े appके लिए निर्देशिका DIRSमें TEMPLATES

संशोधित करें settings.py

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]

यह एकमात्र समाधान था जो मेरे लिए django 2.2.7 का उपयोग करके काम करता है
झोनटास क्लिंकौफ़

1
मेरे मामले में केवल चरण 2 गायब था। डीआईआरएस सरणी मैं वह खाली छोड़ सकता है और यह अभी भी काम करता है और ऐप के सही टेम्प्लेट निर्देशिका में टेम्पलेट की तलाश करता है।
श्री शिंदे

13

सेटिंग में .py को TEMPLATE_LOADERS और TEMPLATE DIRS तब ADD निकालें

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',
        ],
    },
 },
]

5

मुझे शर्मनाक समस्या थी ...

मुझे यह त्रुटि मिली क्योंकि मैं भाग रहा था और ऐप को डालना भूल गया था INSTALLED_APPS। आपको लगता है कि Django एक अधिक वर्णनात्मक त्रुटि उठाएगा।


4

बस एक कूबड़, लेकिन Django टेम्पलेट लोडिंग पर इस लेख को देखें । विशेष रूप से, सुनिश्चित करें कि आपके पास django.template.loaders.app_directories.Loaderअपनी TEMPLATE_LOADERS सूची है।


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

4

टेम्पलेट्स और appname निर्देशिकाओं पर अनुमतियों की जाँच करें, या तो ls के साथ-या django से एक पूर्ण मार्ग खुला () करने का प्रयास करें।


4

मेरी कोशिश के बाद अब यह काम करता है

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

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

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

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

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

किसी को पता है क्यों?


4

डीजेजू संस्करण 1.9 के लिए, मैंने जोड़ा

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

सेटिंग के लिए टेम्प्लेट्स को सेटिंग में सेट करें Oracle और यह अच्छी तरह से काम करता है


3

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

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

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

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

1

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

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पथ में नहीं मेरी त्रुटि में।
फिर फ़ाइल को अपने टेम्प्लेट पथ TEMPLATESमें बदलेंsetting.py

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

1

मुझे आंतरिक APP के लिए टेम्प्लेट का उपयोग करना चाहिए और यह मेरे लिए काम करता है:

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

1

सुनिश्चित करें कि आपने अपना ऐप project-name/app-namme/settings.py INSTALLED_APPS में जोड़ लिया है :।

INSTALLED_APPS = ['app-name.apps.AppNameConfig']

और project-name/app-namme/settings.py मंदिरों पर :।

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


0

हाय दोस्तों मुझे एक नया उपाय मिला। दरअसल यह TEMPLATE_DIRS को परिभाषित करने के बजाय एक अन्य टेम्पलेट में परिभाषित किया गया है, अपनी निर्देशिका पथ का नाम उनके नाम पर रखें: यहां छवि विवरण दर्ज करें


0

मैं इसे स्वीकार करने के लिए शर्मिंदा हूं, लेकिन मेरे लिए समस्या यह थी कि ….hmlइसके बजाय एक टेम्पलेट निर्दिष्ट किया गया था ….html। ध्यान रहे!


0

मैंने इसे जोड़ा

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

और फिर भी यह त्रुटि दिखाई दी, तब मैंने महसूस किया कि किसी अन्य प्रोजेक्ट में टेम्पलेट सेटिंग्स कोड में उस कोड को जोड़े बिना दिखा रहे थे, इसलिए मैंने उस परियोजना की जाँच की और मुझे एहसास हुआ कि मैंने इस परियोजना में एक आभासी वातावरण नहीं बनाया है इसलिए मैंने किया

virtualenv env 

और यह काम किया, पता नहीं क्यों


0

मैं इस समस्या को लेकर आया था। यहां बताया गया है कि मैंने इसे कैसे हल किया:

अपनी सेटिंग्स को देखें, TEMPLATESवैरिएबल का पता लगाएं , मंदिरों के अंदर, DIRSसूची के अंदर अपना टेम्पलेट पथ जोड़ें । मेरे लिए, पहले मैंने अपना टेम्प्लेट पथ सेट किया TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), फिर सूची TEMPLATES_PATHमें जोड़ें । फिर सर्वर को फिर से शुरू करें, टेम्प्लेटडॉट्स नोस्टस्टिस्ट अपवाद गया है। बस।DIRS'DIRS':[TEMPLATES_PATH,]


0

आपकी setting.pyफ़ाइल DIRSमें इसके TEMPLATESसाथ सरणी में बदलें

'DIRS': []

इसके लिए

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

लेकिन 1 लगता है कि यू को जानना है कि आपको नाम के साथ एक फ़ोल्डर बनाना है templates और इसे रूट पथ पर होना चाहिए अन्यथा यू को DIRSमान बदलना होगा


0

1. अपने 'ऐप' में एक फोल्डर 'टेम्प्लेट' बनाएँ (आप अपने ऐप का नाम बताएं) और आप html फाइल यहाँ रख सकते हैं। लेकिन यह दृढ़ता से 'टेम्प्लेट' फ़ोल्डर में समान नाम ('ऐप') के साथ एक फ़ोल्डर बनाने की सिफारिश करता है और उसके बाद ही वहाँ htmls डालता है। 'ऐप / टेम्प्लेट / ऐप' फ़ोल्डर में

2. 'में' app 'urls.py डाल:

  path('', views.index, name='index'), # in case of  use default server index.html 

3. 'ऐप' के दृश्यों में रखा गया है:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.