Explorar el Código

Merge pull request #195 from pydanny/ajax-docs-example

Added example of AJAX form submission for CBVs.
Tim Graham hace 12 años
padre
commit
89e809c400
Se han modificado 1 ficheros con 40 adiciones y 0 borrados
  1. 40 0
      docs/topics/class-based-views/generic-editing.txt

+ 40 - 0
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