mitchell
mitchell

Reputation: 286

TemplateDoesNotExist Error in django on a simple hello world project

I have a problem using templates in django. I believe I have the template in the right spot and after looking at the path from the error log, the file is there. I also have it working without using render(). But I have tried multiple things and in the error log it shows a path that I can follow to the html file that I am trying to render.

Here is the file structure of my project (Note: this file structure is actually inside C:\my_website)

enter image description here

Relevant code:
Below is my view from the hello app I created. How it is currently there is an error but if I comment out the render() call and use the uncommented code It displays the contents of index.html
C:\my_website\my_website\hello\views

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
import os
import logging #MS ADDED
logger = logging.getLogger(__name__)#MS ADDED


def index(request):
    #!!! It works with this stuff uncommented
    #index_path =  os.path.join(os.path.dirname(os.path.dirname(__file__)),'hello\\templates\\hello\\index.html')
    #logger.error('Views - index_path is ' + index_path) # MS ADDED
    #with open(index_path) as f:
    #   html_string = f.read()
    #return HttpResponse(html_string)
    return render(request, 'hello/index.hmtl')

Below is everything that I have changed in the settings. I read in the Django docs that if you didnt specify a path it would look in a templates directory in the app you create (hello). But leaving DIRS empty in TEMPLATES did gave a TemplateDoesNotExist exception. So I tried a few other things that did not work shown below.
C:\my_website\my_website\my_website\settings


INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'hello.apps.HelloConfig',
]

SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__))#MS ADDED
Temp_Path = os.path.realpath('.')# MS ADDED
index_path =  os.path.join(os.path.dirname(os.path.dirname(__file__)),'hello/templates')#MS ADDED


#MS Note: I tried for DIRS below os.path.join(SETTINGS_PATH,'templates')
#MS Note: I tried for DIRS below Temp_Path + "hello/templates"
#MS Note: I tried for DIRS Below  os.path.join(os.path.dirname(os.path.dirname(__file__)),'hello/templates')

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

Below is the urls
C:\my_website\my_website\my_website

from django.contrib import admin
from django.urls import path

from hello import views

urlpatterns = [
    path('',views.index,name='index'),
    path('admin/', admin.site.urls),
    #path('hello/', hello.views.index),
]

error log:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/

Django Version: 3.1.2
Python Version: 3.8.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'hello.apps.HelloConfig']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']

Template loader postmortem
Django tried loading these templates, in this order:

Using engine django:
    * django.template.loaders.filesystem.Loader: C:\my_website\my_website\templates\hello\index.hmtl (Source does not exist)
    * django.template.loaders.app_directories.Loader: C:\my_website\env\lib\site-packages\django\contrib\admin\templates\hello\index.hmtl (Source does not exist)
    * django.template.loaders.app_directories.Loader: C:\my_website\env\lib\site-packages\django\contrib\auth\templates\hello\index.hmtl (Source does not exist)
    * django.template.loaders.app_directories.Loader: C:\my_website\my_website\hello\templates\hello\index.hmtl (Source does not exist)



Traceback (most recent call last):
  File "C:\my_website\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\my_website\env\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\my_website\my_website\hello\views.py", line 16, in index
    return render(request, 'hello/index.hmtl')
  File "C:\my_website\env\lib\site-packages\django\shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:\my_website\env\lib\site-packages\django\template\loader.py", line 61, in render_to_string
    template = get_template(template_name, using=using)
  File "C:\my_website\env\lib\site-packages\django\template\loader.py", line 19, in get_template
    raise TemplateDoesNotExist(template_name, chain=chain)

Exception Type: TemplateDoesNotExist at /
Exception Value: hello/index.hmtl

In the error log it says this
C:\my_website\my_website\hello\templates\hello\index.hmtl (Source does not exist) But it does exist and it contains just <h1>Hello World! aafa</h1>

With the commented out code in the view, the app displays:

enter image description here

I am using django version 3.1.2 and python version 3.8.6
any help would be greatly appreciated

Upvotes: 0

Views: 427

Answers (1)

diegoacr96
diegoacr96

Reputation: 66

In the render function you're passing "index.hmtl" instead of "index.html"

Upvotes: 5

Related Questions