Reputation: 391
I am making a login form in Django. When I am click on login submit button , It gives an error of
ValueError at /registration/ The view registration.views.login didn't return an HttpResponse object.
The view file is
from django.template import loader
from django.shortcuts import render
from registration.models import Registration
from django.http import HttpResponse
def login(request):
if request.method == 'POST':
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user is not None:
if user.is_active:
login(request, user)
# success
return HttpResponseRedirect('sucess')
else:
# disabled account
return direct_to_template(request, 'inactive_account.html')
else:
# invalid login
return direct_to_template(request, 'invalid_login.html')
def logout(request):
logout(request)
return direct_to_template(request, 'logged_out.html')
and login.html file is
<h3>Login</h3>
<form action="/login/" method="post" accept-charset="utf-8">
<label for="username">Username:--</label><input type="text" name="username" value="" id="username" /><br>
<label for="password">Password:-- </label><input type="password" name="password" value="" id="password" />
<p><input type="submit" value="Login →"></p>
</form>
Upvotes: 0
Views: 199
Reputation: 5864
Your login view will return a HttpResponse for a POST request only (on form submit). When you address your browser to login page, it makes a GET request, which is not handled in your view
I`ll recomend you to read more about user athentication: doc.
And as mentioned, use render
or render_to_response
functions from django.shortcuts
Upvotes: 1
Reputation: 474
Why not you are using render_to_response
?
The answer of your question is you are not returning the Httpresponse
object
If your login is successful then only you will be redirect to success .
Try this
return render_to_response(your_template_name,
context_instance=RequestContext(request))
Don't forget to import context_instance like
from django.template import RequestContext
Upvotes: 0
Reputation: 53336
Instead of direct_to_template
you may want to use render_to_response
which renders a given template and returns HttpResponse.
Refer render_to_response. Note; you will have to import it using from django.shortcuts import render_to_response
Upvotes: 0