user1597122
user1597122

Reputation: 327

The view didn't return an HttpResponse object error when form is not valid: django

I've used Django forms. I have this function in views.py:

def func(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            //do processing            
            return HttpResponseRedirect('/')
    else:
        form = MyForm()
        return render_to_response("checkbox.html", RequestContext(request, {'form':form}))

but when form is invalid, it shows me the error: The view didn't return an HttpResponse object. I've searched and realized every where the view functions are like this, but I don't know why mine has error. It seems it doesn't know what to do, while form in invalid!!! Why it doesn't show the page and show user the form errors? can you please help me?

Upvotes: 2

Views: 2314

Answers (2)

César
César

Reputation: 10119

You already have your answer on @miki725 post. Just a suggestion you might want to consider GET as the default behaviour to avoid those if .. else:

def func(request):
    # GET is the default behaviour
    form = MyForm()

    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            //do processing            
            return HttpResponseRedirect('/')

    return render_to_response("checkbox.html", RequestContext(request, {'form':form}))

Upvotes: 3

miki725
miki725

Reputation: 27861

When the form is invalid, the view just returns since else part of the if statement is only evaluated when the request.method == "POST" is False, which it is not...

To fix this, the following is the usual pattern for making form views:

def func(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            //do processing            
            return HttpResponseRedirect('/')
    else:
        form = MyForm()

    # outside of the else clause
    # if the form is invalid, then it will also show the error messages to the user
    return render_to_response("checkbox.html", RequestContext(request, {'form':form}))

Upvotes: 4

Related Questions