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.


¿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__))

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

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

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

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.


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.


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.


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é?


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


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

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

1

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

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

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

0

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


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í


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!


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é


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.


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.