14

I have a simple view in which I'm saving a form. The code seems 'clean', but I can't get rid of the error:

"The view didn't return an HttpResponse object."

Though I've searched on the web, I did not find a relevant indication.

def classroom_privacy(request,classname):
         theclass = Classroom.objects.get(classname=classname)
     if request.method == 'POST':  
       form = PrivacyClass(request.POST)
       if form.is_valid():
           new_obj = form.save(commit=False)
           new_obj.save()
           return HttpResponseRedirect('.')    
       else:
           form = PrivacyClass()     
       return render_to_response('classroom/classroom_privacy.html', {'form': form}, 
          context_instance=RequestContext(request))
Jason Aller
  • 3,541
  • 28
  • 38
  • 38
dana
  • 5,168
  • 20
  • 75
  • 116

3 Answers3

26

verify the indentation of your code

def classroom_privacy(request, classname):
    theclass = Classroom.objects.get(classname=classname)
    if request.method == 'POST':
        form = PrivacyClass(request.POST)
        if form.is_valid():
            new_obj = form.save(commit=False)
            new_obj.save()
            return HttpResponseRedirect('.') 
    else:
        form = PrivacyClass()  

    return render_to_response('classroom/classroom_privacy.html', {'form': form}, context_instance=RequestContext(request))

if it is get request, render a unbound form

if it is post request and invalid form render a bound form

if it is post request and valid form redirect the page

Ashok
  • 10,373
  • 3
  • 36
  • 23
7

All view functions must return some kind of HttpResponse object. There exists a code path in your function where None will be returned instead. This will occur when request.method != 'POST' and you'll simply "fall off the end" of your function (which will return None).

Brian Neal
  • 31,821
  • 7
  • 55
  • 59
  • yes. you are right. my problem was more trivial yet, though i couldn't see. i had an indentation problem, and that 'else' was interpreted as being for the second if. Thanks so much for interest! :) – dana Jun 21 '10 at 14:03
0

If you are using the Django Rest framework. Use the below code to return the HTTP response to resolve this issue.

from django.http import HttpResponse

def TestAPI(request):
    # some logic
    return HttpResponse('Hello')

JSON Response return example:

def TestAPI(request):
    your_json = [{'key1': value, 'key2': value}]
    return HttpResponse(your_json, 'application/json')

For more details about HttpResponse: https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http.HttpResponse

Sathiamoorthy
  • 8,831
  • 9
  • 65
  • 77