Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django TemplateDoesNotExist?

Tags:

django

My local machine is running Python 2.5 and Nginx on Ubuntu 8.10, with Django builded from latest development trunk.

For every URL I request, it throws:

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',)

Is it looking for /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html in this case? The weird thing is this file does existed on disk. Why can't Django locate it?

I run the same application on a remote server with Python 2.6 on Ubuntu 9.04 without such problem. Other settings are the same.

Is there anything misconfigured on my local machine, or what could possibly have caused such errors that I should look into?

In my settings.py, I have specified:

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'), ) 

It should be looking for the following files:

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

All the above files exist on disk.

Solved

It works now after I tried:

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

It's strange. I don't need to do this on the remote server to make it work.

like image 583
jack Avatar asked Dec 18 '09 03:12

jack


2 Answers

First solution:

These settings

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

mean that Django will look at the templates from templates/ directory under your project.

Assuming your Django project is located at /usr/lib/python2.5/site-packages/projectname/ then with your settings django will look for the templates under /usr/lib/python2.5/site-packages/projectname/templates/

So in that case we want to move our templates to be structured like this:

/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 

Second solution:

If that still doesn't work and assuming that you have the apps configured in settings.py like this:

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

By default Django will load the templates under templates/ directory under every installed apps. So with your directory structure, we want to move our templates to be like this:

/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 may not be defined by default. In which case, you will want to define it (in settings.py):

import os SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)) 
like image 127
Joshua Partogi Avatar answered Oct 03 '22 09:10

Joshua Partogi


Find this tuple:

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

You need to add to 'DIRS' the string

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

So altogether you need:

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',             ],         },     }, ] 
like image 24
Bacs Avatar answered Oct 03 '22 10:10

Bacs