title: Django Ajax login form
body: <p>I am trying to submit a login form using ajax. I am confused as to how I am supposed to handle the exceptions/successful responses. I am getting a 200 OK from the server and the form returns error's either by the password/username field. How can I get a error message for to display or redirect the user to the appropriate page depending on the server response?</p>
  
  <p><strong>JQUERY:</strong></p>
  
  <pre><code>56 $(window).load(function(){                                                                                                                  
  57 $('#login_form').submit(function(e){                                                                                                        
  58             e.preventDefault();                                                                                                             
  59     var request_url = document.getElementById('next').value                                                                             
  60          $.ajax({                                                                                                                           
  61             type:"POST",                                                                                                                    
  62             url: $(this).attr('action'),                                                                                                    
  63             data: $('#login_form').serialize(),                                                                                             
  64             success: function(response){ $('#msg').text(response);                                                                          
  65             console.log(response);                                                                                                          
  66             },                                                                                                                              
  67             error: function(xhr, ajaxOptions, thrownError){ alert( $('#login_error').text('Username already taken. Please select another one.')}, 
  68           });                                                                                                                               
  69     });                                                                                                                                     
  70 }); 
  </code></pre>
  
  <p><strong>VIEW: UPDATED</strong></p>
  
  <pre><code>51 def login(request):                                                                                                                         
  52     if request.method == 'POST':                                                                                                            
  53         request.session.set_test_cookie()                                                                                                   
  54         login_form = AuthenticationForm(request, request.POST)                                                                              
  55         if login_form.is_valid():                                                                                                           
  56             if request.is_ajax:                                                                                                             
  57                 user = django_login(request, login_form.get_user())                                                                         
  58                 if user is not None:                                                                                                        
  59                     return HttpResponseRedirect(request.REQUEST.get('next', '/'))
             **else:**                                                                                                                               
  61                **return HttpResponseForbidden() # catch invalid ajax and all non ajax**                                        
  60     else:                                                                                                                                   
  61         login_form = AuthenticationForm(request)                                                                                            
  62                                                                                                                                             
  63     c = Context({                                                                                                                           
  64         'next': request.REQUEST.get('next'),                                                                                                
  65         'login_form': login_form,                                                                                                           
  66         'request':request,                                                                                                                  
  67     })                                                                                                                                      
  68     return render_to_response('login.html', c, context_instance=RequestContext(request))    
  </code></pre>
  
  <p><strong>FORM:</strong></p>
  
  <pre><code>7   &lt;tt id="login_error"&gt;&lt;/tt&gt;                                                                                                                            
  8   &lt;form id="login_form" action="" method="post"&gt;                                                                                            
  9                                                                                                                                             
  10     {{ login_form }}                                                                                                                        
  11     &lt;input type="submit" value="login"/&gt;                                                                                                    
  12     &lt;input type="hidden" id="request_path" name="next" value="/"/&gt;                                                                          
  13   &lt;/form&gt;                                                                                                                                   
  14 &lt;p&gt;{{ request.get_full_path }}&lt;/p&gt;                                                                                                          
  15 &lt;tt id='msg'&gt;&lt;/tt&gt;         
  </code></pre>