[Answered ]-Django Posts Not Working:

1👍

Can you directly access your javascript files from the production server? Which Django version are you using in production? If you are using 1.2.5+ in production, you will need to push the csrf token to the server during an AJAX post operation.

See the release notes in 1.2.5 and CSRF

To check your Django version:

import django
django.get_version()

Print the above in your production site or from the shell in your production server while making sure you are using the proper Python path.

1👍

Your code appears fine with a cursory glance, but I’ll show you an example of my ajax form processing code in a hope it’ll help with figuring out the error that’s occurring. Though, what @dmitry commented should be your first debugging step – use firebug or the inspector to see if the ajax call returns an error.

// js (jQuery 1.5)
$(form).submit(function(event) {
            event.preventDefault();
            $.post(post_url, $(form).serialize())
              .success(function(data, status, jqxhr) {
                if (data.success) { // form was valid
                    $(form)
                    // other irrelevant code
                    .siblings('span')
                      .removeClass('error')
                      .html('Form Successful');
                } else { // form was invalid
                    $(form).siblings('span').addClass('error').html('Error Occurred');
                }
              })
              .error(function(jqxhr, status, error) { // server error
                $(form).siblings('span').addClass('error').html("Error: " + error);
              });
});


// django
class AjaxFormView(FormView):
    def ajax_response(self, context, success=True):
        html = render_to_string(self.template_name, context)
        response = simplejson.dumps({'success': success, 'html': html})
        return HttpResponse(response, content_type="application/json", mimetype='application/json')


// view deriving from AjaxFormView

    def form_valid(self, form):
        registration = form.save()
        if self.request.is_ajax():
            context = {'competition': registration.competition }
            return self.ajax_response(context, success=True)
        return HttpResponseRedirect(registration.competition.get_absolute_url())

    def form_invalid(self, form):
        if self.request.is_ajax():
            context = { 'errors': 'Error Occurred'}
            return self.ajax_response(context, success=False)
        return render_to_response(self.template_name, {'errors':form.errors})

Actually, comparing the above to your code, you may need to set the content_type in your django view so that jQuery can understand and process the response. Note that the above is using django 1.3 class-based views, but the logic should be familiar regardless. I use context.success to signal if the form processing passed or failed – since a valid response (json) of any kind will signal the jQuery.post that the request was successful.

Leave a comment