El archivo Django “TemplateDoesNotExist”, pero el archivo “Usando el cargador django.template.loaders.app_directories.Loader” existe

El Cargador de plantillas encuentra la plantilla pero la plantilla no está cargada

TemplateDoesNotExist at /cardpayment/ cardpayment.html Request Method: GET Request URL: http://localhost:7000/cardpayment/ Django Version: 1.8 Exception Type: TemplateDoesNotExist Exception Value: cardpayment.html Exception Location: /home/sdr/sl/lib/python3.4/site-packages/django/template/loader.py in render_to_string, line 138 Python Executable: /home/sdr/sl/bin/python Python Version: 3.4.3 Python Path: ['/home/sdr/sl/agryp', '/home/sdr/pycharm-4.0.6/helpers/pydev', '/home/sdr/sl/src/tastypie', '/home/sdr/sl/agryp', '/usr/local/lib/python34.zip', '/usr/local/lib/python3.4', '/usr/local/lib/python3.4/plat-linux', '/usr/local/lib/python3.4/lib-dynload', '/home/sdr/sl/lib/python3.4/site-packages'] Server time: Tue, 5 May 2015 10:17:40 +0000 Template-loader postmortem Django tried loading these templates, in this order: Using loader django.template.loaders.filesystem.Loader: /home/sdr/sl/agryp/templates/cardpayment.html (File does not exist) Using loader django.template.loaders.app_directories.Loader: /home/sdr/sl/agryp/agryp/templates/cardpayment.html (File exists) <=========== FILE EXISTS BUT NOT LOADED /home/sdr/sl/src/tastypie/tastypie/templates/cardpayment.html (File does not exist) /home/sdr/sl/lib/python3.4/site-packages/grappelli/templates/cardpayment.html (File does not exist) /home/sdr/sl/lib/python3.4/site-packages/django/contrib/admin/templates/cardpayment.html (File does not exist) /home/sdr/sl/lib/python3.4/site-packages/django/contrib/auth/templates/cardpayment.html (File does not exist) /home/sdr/sl/lib/python3.4/site-packages/oauth2_provider/templates/cardpayment.html (File does not exist) /home/sdr/sl/lib/python3.4/site-packages/selectable/templates/cardpayment.html (File does not exist) 

Como puede verse claramente, el cargador puede encontrar la plantilla.

El valor de TEMPLATE_DIRS en settings.py es el siguiente:

 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [ os.path.join(BASE_DIR, "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', 'allauth.account.context_processors.account', 'allauth.socialaccount.context_processors.socialaccount', ], }, }, ] 

He intentado mover la plantilla al directorio proyecto / plantillas también, pero el error persiste.

Código comprueba con 0 errores / advertencias.

contenido de cardpayment.html

 {% extends "base.html" %} {% block title %}Card Payments over Phone{% endblock %} {% block extrahead %} {% load selectable_tags %} {% include_ui_theme %} {% endblock %} {% block content %} 

Receive Card Payment

{{ form.as_table }}
{% endblock %}

Me he estado encontrando con el mismo problema, la solución que funcionó fue especificar mi directorio de plantillas (proyectos / plantillas) en configuraciones de plantillas como esta:

 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': ['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', "django.core.context_processors.media", ], }, }, 

]

También estoy usando la opción de configuración DIRS de una manera similar a la tuya y acabo de encontrar el mismo problema en Django 1.8.2. El problema parece estar relacionado con la forma en que invoca django.shortcuts.render (o django.shortcuts.render_to_response ) en sus vistas. ¿Está utilizando estas?

TL; DR: intente cambiar su invocación de render_to_response en sus vistas para que no pase una context_instance o un argumento en desuso , como el django.template.RequestContext utilizado django.template.RequestContext . Si pasa una context_instance , o cualquier otro argumento en desuso, el código de carga de la plantilla de django usa una ruta heredada que no admite la opción DIRS y su plantilla no se cargará, incluso si existe en el disco.

Aquí hay una sección del código relevante de la fuente de Django ( django/shortcuts.py ) que muestra cómo se produce esta situación:

 def render_to_response(template_name, context=None, context_instance=_context_instance_undefined, content_type=None, status=None, dirs=_dirs_undefined, dictionary=_dictionary_undefined, using=None): """ Returns a HttpResponse whose content is filled with the result of calling django.template.loader.render_to_string() with the passed arguments. """ if (context_instance is _context_instance_undefined and dirs is _dirs_undefined and dictionary is _dictionary_undefined): # No deprecated arguments were passed - use the new code path content = loader.render_to_string(template_name, context, using=using) else: # Some deprecated arguments were passed - use the legacy code path content = loader.render_to_string( template_name, context, context_instance, dirs, dictionary, using=using) return HttpResponse(content, content_type, status) 

Si sigue esto al método render_to_string del cargador (en django/template/loader.py ) puede ver que su plantilla no se cargará si pasa argumentos desaprobados a render_to_reponse en sus vistas:

 def render_to_string(template_name, context=None, context_instance=_context_instance_undefined, dirs=_dirs_undefined, dictionary=_dictionary_undefined, request=None, using=None): """ Loads a template and renders it with a context. Returns a string. template_name may be a string or a list of strings. """ if (context_instance is _context_instance_undefined and dirs is _dirs_undefined and dictionary is _dictionary_undefined): # No deprecated arguments were passed - use the new code path if isinstance(template_name, (list, tuple)): template = select_template(template_name, using=using) else: template = get_template(template_name, using=using) return template.render(context, request) else: # Some deprecated arguments were passed - use the legacy code path for engine in _engine_list(using): try: # This is required for deprecating properly arguments specific # to Django templates. Remove Engine.render_to_string() at the # same time as this code path in Django 2.0. if isinstance(engine, DjangoTemplates): if request is not None: raise ValueError( "render_to_string doesn't support the request argument " "when some deprecated arguments are passed.") continue # Hack -- use the internal Engine instance of DjangoTemplates. return engine.engine.render_to_string( template_name, context, context_instance, dirs, dictionary) elif context_instance is not _context_instance_undefined: warnings.warn( "Skipping template backend %s because its render_to_string " "method doesn't support the context_instance argument." % engine.name, stacklevel=2) elif dirs is not _dirs_undefined: warnings.warn( "Skipping template backend %s because its render_to_string " "method doesn't support the dirs argument." % engine.name, stacklevel=2) elif dictionary is not _dictionary_undefined: warnings.warn( "Skipping template backend %s because its render_to_string " "method doesn't support the dictionary argument." % engine.name, stacklevel=2) except TemplateDoesNotExist: continue if template_name: if isinstance(template_name, (list, tuple)): template_name = ', '.join(template_name) raise TemplateDoesNotExist(template_name) else: raise TemplateDoesNotExist("No template names provided") 

TemplateDoesNotExist... cardpayment.html puede significar que Django no puede encontrar cardpayment.html , o puede significar que no puede encontrar cardpayment.html ningún problema, pero no puede encontrar algunos {% include 'cardpayment_subsection.html' %} dentro de él.

Explicación:

Recibí este error justo ahora, en un proyecto que ha estado funcionando durante años, y las otras soluciones aquí no me ayudaron.

Los cargadores de plantillas encontraban mi cardpayment.html , pero contenían algunas tonterías, lo que significaba que no se podían procesar. Los mensajes de error me engañaron al pensar que Django no sabía que el archivo existe, cuando en realidad sabía que existía, simplemente no podía procesarlo.

Por un tiempo, todo funcionaba bien: cardpayment.html se cardpayment.html sin problemas.

vistas.py

 def cardpaymentview(request): return render_to_response("cardpayment.html", { "message": "Hi SO" }, context_instance=RequestContext(request)) 

De repente, aunque no había estado editando cardpayment.html , recibí ese error:

TemplateDoesNotExist at / cardpaymentpage: cardpayment.html

 Using loader django.template.loaders.app_directories.Loader: folder/lib/python2.7/site-packages/django/contrib/admin/templates/cardpayment.html (File does not exist) folder/project/app1/templates/cardpayment.html (File does not exist) folder/project/app2/templates/cardpayment.html (File does not exist) folder/project/paymentapp/templates/cardpayment.html (File exists) 

El problema fue que mi cardpayment.html a su vez tiene un include llama a otra plantilla:

 {% include 'cardpayment_subsection.html' %} 

cardpayment_subsection.html el error cambiando el nombre del archivo cardpayment_subsection.html a something_else.html , sin editar cardpayment.html , por lo que el comando de include naturalmente falló.

Pero como puede ver, el mensaje de depuración no indicaba que el problema fuera el de cardpayment_subsection.html (el archivo ya no existe).

Resumen: si otras soluciones no funcionan para usted, intente crear un archivo de prueba cardpayment2.html que simplemente diga “Hola mundo” y vea si al menos puede hacer eso. Tal vez el archivo cardpayment.html se está leyendo, pero contiene un error. (En mi caso, tuve que cambiar el {% include '____.html' %} para referirme a un archivo que realmente existe.)

Encontré una solución. No estoy seguro de por qué, pero la nueva directiva TEMPLATES (Django 1.8+) no parece estar funcionando. Comenté eso y lo puse en el viejo estilo.

 TEMPLATE_DIRS = ( '/home/sdr/sl/agryp/templates/', ) 

Directiva, todo comenzó a funcionar de nuevo. ARGH!

Necesitaré averiguar por qué la nueva directiva de PLANTILLAS me está causando problemas.

Gracias por tratar de ayudar a los chicos!