2009-12-18 31 views
77

Mi máquina local ejecuta Python 2.5 y Nginx en Ubuntu 8.10, con Django integrado en el último tronco de desarrollo.Django TemplateDoesNotExist?

Por cada URL solicito, que arroja:

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

¿Está buscando /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html en este caso? Lo extraño es que este archivo SÍ existió en el disco. ¿Por qué Django no puede ubicarlo?

Ejecuto la misma aplicación en un servidor remoto con Python 2.6 en Ubuntu 9.04 sin tal problema. Otras configuraciones son iguales.

¿Hay algún error de configuración en mi máquina local, o qué podría haber causado tales errores que debo investigar?

En mi settings.py, he determinado:

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

Se shoule estar buscando los siguientes archivos

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

Todos los archivos anteriores existe en el disco.

RESUELTO

Funciona ahora después de que trató chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

Es extraño. No necesito hacer esto en el servidor remoto para que funcione.

+0

¿su TEMPLATE_DIRS es legible por el servidor web? –

+0

@Jordan, TEMPLATE_DIRS accesible por root es suficiente. Es lo que está configurado en el servidor remoto que está funcionando. – jack

Respuesta

112

Primera solución:

Estos ajustes

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

significa que Django se verá en las plantillas de templates/ directorio bajo el proyecto.

Asumiendo que su proyecto de Django está situado en /usr/lib/python2.5/site-packages/projectname/ luego con la configuración de Django buscar las plantillas bajo /usr/lib/python2.5/site-packages/projectname/templates/

Así que en ese caso queremos pasar nuestras plantillas a estructurarse como esto:

/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 

Segunda solución:

Si eso todavía no funciona y suponiendo que tiene las aplicaciones configuradas en settings.py como esta:

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

Por defecto Django carga las plantillas bajo templates/ directorio en cada aplicaciones instaladas.Así que con la estructura de directorios, queremos pasar nuestras plantillas que ser así:

/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 

Espero que ayude.

SETTINGS_PATH puede no estar definido de manera predeterminada. En cuyo caso, tendrá que definirlo (en settings.py):

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

@jpartogi, me trataron ambos enfoques, pero no funciona ninguno. Incluso traté de usar la ruta absoluta a la plantilla en el argumento render_to_response() pero aún no funcionó. – jack

+0

¿Su proyecto django está bajo '/ usr/lib/python2.5/site-packages/projectname /'? –

+0

@jpartogi, sí, todas las aplicaciones instaladas están en /usr/lib/python2.5/site-packages/projectname/appname1, ... – jack

3

Solo una corazonada, pero echa un vistazo a this article on Django template loading. En particular, asegúrese de tener django.template.loaders.app_directories.Loader en su lista TEMPLATE_LOADERS.

+0

Esto funcionó para mí. Carga plantillas de aplicaciones de Django en el sistema de archivos. Para cada aplicación en INSTALLED_APPS, el cargador busca un subdirectorio de plantillas. Si el directorio existe, Django busca plantillas allí.
PLANTILLAS = [{ 'back-end': '' django.template.backends.django.DjangoTemplates, 'APP_DIRS': Es cierto, }] – Vijay

0

Compruebe que sus templates.html están en /usr/lib/python2.5/site-packages/projectname/templates dir.

4

Compruebe los permisos de plantillas y appName directorios, ya sea con ls -l o intentar hacer una ruta absoluta abierto() de Django.

4

Funciona ahora después de que trató

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

Es extraño. No necesito hacer esto en el servidor remoto para que funcione.

Además, tengo que ejecutar el siguiente comando en la máquina local para hacer que todos los archivos estáticos sean accesibles pero en el servidor remoto todos son "raíz: raíz".

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

La máquina local se ejecuta en Ubuntu 8.04 desktop edition. El servidor remoto está en la edición del servidor Ubuntu 9.04.

¿Alguien sabe por qué?

3

Django TemplateDoesNotExist error significa simplemente que el marco no puede encontrar el archivo de plantilla.

Para usar la API de carga de plantillas, deberá indicarle a la estructura donde almacena sus plantillas. El lugar para hacer esto está en su archivo de configuración (settings.py) por configuración TEMPLATE_DIRS. Por defecto es una tupla vacía, por lo que esta configuración le dice al mecanismo de carga de plantillas de Django dónde buscar las plantillas.

Elija un directorio en el que desea almacenar las plantillas y añadirlo a TEMPLATE_DIRS por ejemplo:

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

OMG no puedo creer que esto haya funcionado, amigo. –

27

Encontrar esta tupla:

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

Es necesario añadir a 'DIRS' la cadena

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

Así por completo lo que necesita:

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' no está realmente definido en ninguna parte, así que no creo que esta respuesta funcione. Quizás quisiste decir' BASE_DIR' – sofly

6

Al establecer .py quitar TEMPLATE_LOADERS y la plantilla DIRS Entonces AÑADIR

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

¡Gracias! Agregar ruta a 'DIRS' funcionó perfectamente . – Shilpa

1

Para la versión django 1.9, añadí

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

línea a las plantillas de bloques de la configuración.py Y funcionó bien

0

Consejo sobre las carpetas Django intenta cargar vistazo a la plantilla Template-loader postmortem en la página de error, por ejemplo, el error se sothing así:

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) 

En mi error vcsrc\vcsrc\templates\base.html no en ruta.
Luego de modificación del archivo TEMPLATES en setting.py a su ruta de plantillas

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

Hola chicos he encontrado una nueva solución. En realidad, se define en otra plantilla así que en vez de definir a TEMPLATE_DIRS usted mismo, ponga su nombre de ruta de directorio en su: enter image description here