158

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?

starball
  • 20,030
  • 7
  • 43
  • 238
Coeus
  • 2,385
  • 3
  • 17
  • 27

14 Answers14

398

Make sure you have rest_framework in your settings's INSTALLED_APPS

Linovia
  • 19,812
  • 4
  • 47
  • 48
  • Its already present. I believe @api_view is not allowing me to render html page..Is there any other solution – Coeus Jul 14 '16 at 07:29
  • You want to double check that by opening the django shell and looking at the INSTALLED_APPS. It's unlikely api_view since I got it working and it would return an HTTP 415 Unsupported Media Type. – Linovia Jul 14 '16 at 07:32
  • this function works with CURL command, I also get response, when i try to render html with my browser, I get the above listed error – Coeus Jul 14 '16 at 07:47
  • This should be selected has answer? – niran Apr 24 '18 at 15:21
82

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

INSTALLED_APPS = [
    'rest_framework',
]
sarath kumar
  • 1,265
  • 10
  • 6
29

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.

Community
  • 1
  • 1
Mark Doliner
  • 1,543
  • 15
  • 17
27

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

13

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

INSTALLED_APPS = [
    'rest_framework',
]
Jeremy Caney
  • 7,102
  • 69
  • 48
  • 77
coding360
  • 161
  • 1
  • 2
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.

Ross Rogers
  • 23,523
  • 27
  • 108
  • 164
11

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

p kushwaha
  • 327
  • 2
  • 9
10

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.

Bhardwaj Vishal
  • 103
  • 1
  • 3
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'
],
Juwaini
  • 36
  • 3
2

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.

1

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

Duc Tran
  • 11
  • 1
1

instead of using HttpResponse, use:

from rest_framework.response import Response

return Response(data=message, status=status.HTTP_200_OK)
Dotun Peter
  • 61
  • 1
  • 7
1

setting.py add rest_framework , if rest_framework is not added

Ex:

INSTALLED_APPS = ["rest_framework"]

Divyesh pal
  • 952
  • 1
  • 11
  • 17
-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