Django: TemplateDoesNotExist (rest_framework/api.html)

DjangoDjango ViewsDjango Rest-Framework

Django Problem Overview


In my view function, I'd like to return a json object (data1) and some text/html (form). Is this possible?

MY code

@api_view(['POST'])
@permission_classes((AllowAny,))
def create_user(request):
    if request.is_ajax():
        if request.method == 'POST':
            serializer = SignupSerializer(data=request.data)
            print 'ser'
            print serializer
            if not serializer.is_valid():
                return Response(serializer.errors,\
                                status=status.HTTP_400_BAD_REQUEST)
            else:
                serializer.save()
                data={'status': 'Created','message': 'Verification email has been sent to your email. Please verify your account.'}
                return Response(data, template_name='register.html')
    else:
        return HttpResponse('hello world')

When I call the url I get status code 500 with error as displayed below

> TemplateDoesNotExist rest_framework/api.html

when I check as a API, I get response with 200 ok status. This shows Im unable to get my html page

How should I get my html depending on request

Thanks in advance

Django Solutions


Solution 1 - Django

Make sure you have rest_framework in your settings's INSTALLED_APPS

Solution 2 - Django

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

INSTALLED_APPS = [
    'rest_framework',
]

Solution 3 - Django

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

Solution 4 - Django

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.

Solution 5 - Django

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.

Solution 6 - Django

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

INSTALLED_APPS = [
    'rest_framework',
]

Solution 7 - Django

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.

Solution 8 - Django

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

Solution 9 - Django

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

Solution 10 - Django

instead of using HttpResponse, use:

from rest_framework.response import Response

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

Solution 11 - Django

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

Solution 12 - Django

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.

Solution 13 - Django

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCoeusView Question on Stackoverflow
Solution 1 - DjangoLinoviaView Answer on Stackoverflow
Solution 2 - Djangosarath kumarView Answer on Stackoverflow
Solution 3 - Djangotechnology issue nepalView Answer on Stackoverflow
Solution 4 - DjangoMark DolinerView Answer on Stackoverflow
Solution 5 - DjangoRoss RogersView Answer on Stackoverflow
Solution 6 - Djangocoding360View Answer on Stackoverflow
Solution 7 - DjangoBhardwaj VishalView Answer on Stackoverflow
Solution 8 - DjangoJuwainiView Answer on Stackoverflow
Solution 9 - DjangoDuc TranView Answer on Stackoverflow
Solution 10 - DjangoDotun PeterView Answer on Stackoverflow
Solution 11 - Djangop kushwahaView Answer on Stackoverflow
Solution 12 - DjangoOdewole OlusegunView Answer on Stackoverflow
Solution 13 - DjangoNickolai KozheninView Answer on Stackoverflow