[Django]-Django: TemplateDoesNotExist (rest_framework/api.html)

412👍

Make sure you have rest_framework in your settings’s INSTALLED_APPS

86👍

Make sure you install pip install djangorestframework and include rest_framework in the setting.py

INSTALLED_APPS = [
    'rest_framework',
]

30👍

This is my attempt to explain the problem and collect everyone else’s responses into a single list. Thanks to everyone for giving me shoulders to stand on!

I believe this happens because Django REST Framework wants to render a template (rest_framework/api.html), but the template can’t be found. It seems there are two approaches to fix this:

Approach 1: Make templates work

Ensure REST Framework is included in INSTALLED_APPS in settings.py:

INSTALLED_APPS = [
    ...
    'rest_framework',
    ...
]

And ensure APP_DIRS is True in your template configuration (it defaults to False if not specified). This allows Django to look for templates in installed applications. Here’s a minimal configuration that seems to work, though you might have more config here:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'APP_DIRS': True,
    },
]

Approach 2: Return a JSON response

If you tell REST Framework to render a JSON response then it doesn’t need to use a template so you don’t need to change the APP_DIRS settings as mentioned above. It also seems like you might not even need to list rest_framework in INSTALLED_APPS, though it might be necessary to have it there for other reasons.

You can do this globally in settings.py:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ]
}

Or if you’re using the @api_view decorator then you can specify JSONRenderer on each view:

@api_view(['GET'])
@renderer_classes([JSONRenderer])
def some_view(request):
    return Response({'status': 'yay'})

See the REST Framework renderers documentation for details.

28👍

I also had same kind of problem.
Make sure you have rest_framework installed in your setting in "installed apps"

14👍

Make sure that you added rest_framework in your installed_apps to your settings.py file:

INSTALLED_APPS = [
    'rest_framework',
]

13👍

”’
Try one of these for sure help you out:

1: add rest_framework to settings.py app list, sometime order in which your applications are listed may be the reason.
”’

INSTALLED_APPS = [
    'rest_framework',
    ...
]

”’
2: review your template settings. See Backend, DIR and APP_DIRS. in case you have customized the rest-framework template please check if the path you have defined is correct, make APP_DIRS: True . In most of the cases this will resolve.
”’

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ....
    }
]

”’
3: check the default renderer classes settings:
”’

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        ...
    ]
}

”’
4: If you are using api_view decorators on function based view make sure you have provided renderers correctly. i.e.

@renderer_classes([JSONRenderer])
”’

12👍

I hit this issue when upgrading from an old Django version to Django 2.0. My settings.py did not have a TEMPLATE directive at all, so I snagged the following from a new django-admin.py startproject ... run:

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

Add that to your settings.py if you don’t have TEMPLATES directive in your settings.py. Worked for me.

11👍

I have come across the same issue and found out that rest_framework wasn’t added to the installed apps in settings.py. Adding it resolved my issue.

5👍

setting.py add rest_framework , if rest_framework is not added

Ex:

INSTALLED_APPS = ["rest_framework"]

3👍

The order of the installed apps matters a lot. In my case i added ‘rest_auth’ above ‘rest_framework’ so it gave this error but when i reordered it (‘rest_framework’ above ‘rest_auth’, ‘rest_auth.registration’, ‘rest_framework.authtoken’ etc), this error cleared.

sample Proper order below:

INSTALLED_APPS = [

...
'rest_framework',
'rest_auth',
'rest_auth.registration',
'rest_framework.authtoken',
...

]

Thanks.

2👍

Other than adding 'rest_framework' inside your INSTALLED_APPS, try adding the following inside your TEMPLATES.OPTIONS:

'loaders': [
     'django.template.loaders.filesystem.Loader',
     'django.template.loaders.app_directories.Loader'
],

1👍

Adding this decorator above that view
@renderer_classes([JSONRenderer])

1👍

instead of using HttpResponse, use:

from rest_framework.response import Response

return Response(data=message, status=status.HTTP_200_OK)

0👍

In installed apps if you used rest_framework in your project add rest_framework in setting.py file:

INSTALLED_APPS = [
    'rest_framework',]

-1👍

I have came across the same problem, I was sending an empty response. Try to put a different infomation into Response() in create_user function to check if it works at all

Leave a comment