summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2012-09-17 16:02:07 -0700
committerTim Graham <timograham@gmail.com>2012-09-17 16:02:07 -0700
commit89e809c4000ba14145e60bf8ea623c1b3e925fd3 (patch)
treedf56ecff0bf8f9a01f90a4c026d56cd9346f7e43
parent23d0136314a23b1678b17d4a30df93d710762365 (diff)
parentb16f8b5fbe4d912daa48b0209dea871b854d8376 (diff)
Merge pull request #195 from pydanny/ajax-docs-example
Added example of AJAX form submission for CBVs.
-rw-r--r--docs/topics/class-based-views/generic-editing.txt40
1 files changed, 40 insertions, 0 deletions
diff --git a/docs/topics/class-based-views/generic-editing.txt b/docs/topics/class-based-views/generic-editing.txt
index 23d346a32a..7bae3c692d 100644
--- a/docs/topics/class-based-views/generic-editing.txt
+++ b/docs/topics/class-based-views/generic-editing.txt
@@ -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