Commit b16f8b5f authored by Marc Tamlyn's avatar Marc Tamlyn
Browse files

Add example of AJAX form submission.

Credit goes to @SystemParadox. Originally developed at #DjangoCon Europe
but wasn't tested enough to merge in.

For history, please see https://github.com/pydanny/django/pull/4
parent bfa9fc69
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -203,3 +203,43 @@ Note that you'll need to :ref:`decorate this
view<decorating-class-based-views>` using
:func:`~django.contrib.auth.decorators.login_required`, or
alternatively handle unauthorised users in the :meth:`form_valid()`.

AJAX example
------------

Here is a simple example showing how you might go about implementing a form that
works for AJAX requests as well as 'normal' form POSTs::

    import json

    from django.http import HttpResponse
    from django.views.generic.edit import CreateView
    from django.views.generic.detail import SingleObjectTemplateResponseMixin

    class AjaxableResponseMixin(object):
        """
        Mixin to add AJAX support to a form.
        Must be used with an object-based FormView (e.g. CreateView)
        """
        def render_to_json_response(self, context, **response_kwargs):
            data = json.dumps(context)
            response_kwargs['content_type'] = 'application/json'
            return HttpResponse(data, **response_kwargs)

        def form_invalid(self, form):
            if self.request.is_ajax():
                return self.render_to_json_response(form.errors, status=400)
            else:
                return super(AjaxableResponseMixin, self).form_invalid(form)

        def form_valid(self, form):
            if self.request.is_ajax():
                data = {
                    'pk': form.instance.pk,
                }
                return self.render_to_json_response(data)
            else:
                return super(AjaxableResponseMixin, self).form_valid(form)

    class AuthorCreate(AjaxableResponseMixin, CreateView):
        model = Author