Django TemplateDoesNotExist?

163

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

Por cada URL que solicito, arroja:

TemplateDoesNotExist en / appname / path appname / template_name.html

Django intentó cargar estas plantillas, en este orden: * Usando el cargador django.template.loaders.filesystem.function: * Usando el cargador 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 existe en el disco. ¿Por qué Django no puede localizarlo?

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

¿Hay algo mal configurado en mi máquina local, o qué podría haber causado tales errores que debería investigar?

En mi settings.py , he especificado:

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

Debería 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 existen en el disco.

Resuelto

Funciona ahora después de que lo intenté:

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.

Jack
fuente
¿Es su TEMPLATE_DIRS legible por el servidor web?
Jordan Messina
@ Jordania, TEMPLATE_DIRS accesible por root es suficiente. Es lo que está configurado en el servidor remoto que está funcionando.
Jack

Respuestas:

196

Primera solución :

Estas configuraciones

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

significa que Django mirará las plantillas del templates/directorio bajo su proyecto.

Suponiendo que su proyecto Django se encuentre en /usr/lib/python2.5/site-packages/projectname/su configuración, django buscará las plantillas en/usr/lib/python2.5/site-packages/projectname/templates/

Entonces, en ese caso, queremos mover nuestras plantillas para estructurarlas así:

/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 de esta manera:

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

Por defecto, Django cargará las plantillas en el templates/directorio debajo de cada aplicación instalada. Entonces, con su estructura de directorio, queremos mover nuestras plantillas para que sean 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

SETTINGS_PATHpuede no estar definido por defecto. En cuyo caso, querrá definirlo (en settings.py):

import os
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))
Joshua Partogi
fuente
3
@jpartogi, probé ambos enfoques pero ninguno funciona. Incluso intenté usar la ruta absoluta a la plantilla en el argumento render_to_response () pero aún no funcionó.
Jack
¿Está su proyecto django bajo /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi
@jpartogi, sí, todas las aplicaciones instaladas están en /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack
¿Puedes editar tu publicación original y pegar settings.py? Excluyendo la configuración DB: -d. Gracias.
Joshua Partogi
Poner cada plantilla de diferentes aplicaciones en un directorio templatesno es un buen diseño. Pero, como sé, después de agregar su APP_NAMEen el settings.py, djangopodría ir a buscar la plantilla de la aplicación en el directorio que está debajo del APP_DIR. Por lo tanto, puede separar la plantilla para varias aplicaciones. (Django 1.7 - .1.9
Alston
59

Encuentra esta tupla:

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

Debe agregar a 'DIRS' la cadena

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

Así que en conjunto necesitas:

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',
            ],
        },
    },
]
Bacs
fuente
24
SETTINGS_PATHen realidad no está definido en ningún lado, por lo que no creo que esta respuesta funcione. Tal vez quisiste decirBASE_DIR
suavemente
1
define SETTINGS_PATH = os.path.dirname (os.path.dirname ( archivo ))
Shapon Pal
1
Creo que Shapon Pal quiere decir SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), no archivo
micrófono
20

Si encuentra este problema cuando agrega un appdesde cero. Probablemente sea porque extrañas algo settings. Se necesitan tres pasos al agregar un app.

1 、 Cree el directorio y el archivo de plantilla.

Supongamos que tiene un proyecto con nombre mysitey desea agregar un appnombre your_app_name. Coloque su archivo de plantilla debajo de la mysite/your_app_name/templates/your_app_namesiguiente manera.

├── 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 、 Añade tu appa INSTALLED_APPS.

Modificar settings.py

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

3 、 Agregue su appdirectorio a DIRSen TEMPLATES.

Modificar settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
W.Perrin
fuente
Esta fue la única solución que me
funcionó
1
En mi caso solo faltaba el paso 2. la matriz DIRS podría dejarlo vacío y aún funcionaba y buscó la plantilla en el directorio de plantillas correcto de la aplicación.
Shri Shinde
13

En la configuración .py, elimine TEMPLATE_LOADERS y TEMPLATE DIRS y luego AGREGUE

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',
        ],
    },
 },
]
jayant singh
fuente
5

Tuve un problema embarazoso ...

Recibí este error porque estaba apurado y olvidé poner la aplicación INSTALLED_APPS. Se podría pensar que Django generaría un error más descriptivo.

Chris Conlan
fuente
4

Solo una corazonada, pero mira este artículo sobre la carga de plantillas de Django . En particular, asegúrese de tenerlo django.template.loaders.app_directories.Loaderen su lista TEMPLATE_LOADERS.

Peter Rowell
fuente
Esto funcionó para mí. Carga plantillas de aplicaciones 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í. <br> PLANTILLAS = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Vijay
4

Verifique los permisos en plantillas y directorios de nombres de aplicaciones, ya sea con ls -l o intente hacer una ruta absoluta open () desde django.

kibitzer
fuente
4

Funciona ahora después de que lo intenté

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 que todos los archivos estáticos sean accesibles, pero en el servidor remoto todos son "root: root".

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

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

¿Alguien sabe por qué?

Jack
fuente
4

Para la versión 1.9 de django, agregué

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

línea al bloque de Plantillas en settings.py Y funcionó bien

Kapilfreeman
fuente
3

El TemplateDoesNotExisterror de Django significa simplemente que el marco no puede encontrar el archivo de plantilla.

Para utilizar la API de carga de plantillas, deberá indicarle al marco dónde almacena sus plantillas. El lugar para hacerlo es en su archivo de configuración ( settings.py) TEMPLATE_DIRSconfigurando. 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 plantillas.

Elija un directorio donde desee almacenar sus plantillas y agréguelo a TEMPLATE_DIRS, por ejemplo:

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

Vea qué carpeta django intenta cargar la plantilla mira Template-loader postmortemen la página de error, por ejemplo, el error se ralentizará 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.htmlno en la ruta.
A continuación, cambiar TEMPLATESde setting.pyarchivo en su camino plantillas

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

Debo usar plantillas para una aplicación interna y funciona para mí:

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

Asegúrese de que ha añadido a su aplicación a la project-name/app-namme/settings.py INSTALLED_APPS: .

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

Y en project-name/app-namme/settings.py plantillas: .

'DIRS': [os.path.join(BASE_DIR, 'templates')],
Murdock Helscream
fuente
0

Verifique que sus templates.html estén en /usr/lib/python2.5/site-packages/projectname/templatesdir.

Juanjo Conti
fuente
0

Hola chicos, encontré una nueva solución. En realidad, se define en otra plantilla, por lo que en lugar de definir TEMPLATE_DIRS usted mismo, coloque el nombre de la ruta del directorio en su: ingrese la descripción de la imagen aquí

Amit
fuente
0

Me da vergüenza admitir esto, pero el problema para mí fue que se había especificado una plantilla en ….hmllugar de ….html. ¡Cuidado!

kokociel
fuente
0

Agregué esto

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

y todavía mostraba el error, luego me di cuenta de que en otro proyecto las plantillas se mostraban sin agregar ese código en el archivo settings.py, así que verifiqué ese proyecto y me di cuenta de que no creé un entorno virtual en este proyecto, así que lo hice

virtualenv env 

y funcionó, no sé por qué

Keval
fuente
0

Se me ocurrió este problema. Así es como resolví esto:

Mire su settings.py, ubique a TEMPLATESvariable, dentro de las PLANTILLAS, agregue su ruta de plantillas dentro de la DIRSlista. Para mí, primero configuro mi ruta de plantillas como TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), luego agrego TEMPLATES_PATHa la DIRSlista 'DIRS':[TEMPLATES_PATH,],. Luego reinicie el servidor, la excepción TemplateDoesNotExist desaparece. Eso es.

imcaozi
fuente
0

en su setting.pyarchivo reemplazar DIRSen TEMPLATESmatriz con esto

'DIRS': []

a esto

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

pero creo que lo que necesita saber es que debe hacer una carpeta con el nombre templates y debe hacerlo en la ruta raíz; de lo contrario, debe cambiar el DIRSvalor

Krishna Kumar Jangid
fuente
0

1.Cree una carpeta 'plantillas' en su 'aplicación' (digamos que ha llamado así a su aplicación) y puede colocar el archivo html aquí. Pero se recomienda crear una carpeta con el mismo nombre ('aplicación') en la carpeta 'plantillas' y solo luego colocar htmls allí. En la carpeta 'app / templates / app'

2.ahora en urls.py de 'aplicación' poner:

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

3. en 'views' de la aplicación 'put:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
CodeToLife
fuente