diff options
| author | Tim Graham <timograham@gmail.com> | 2012-09-17 16:02:07 -0700 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2012-09-17 16:02:07 -0700 |
| commit | 89e809c4000ba14145e60bf8ea623c1b3e925fd3 (patch) | |
| tree | df56ecff0bf8f9a01f90a4c026d56cd9346f7e43 | |
| parent | 23d0136314a23b1678b17d4a30df93d710762365 (diff) | |
| parent | b16f8b5fbe4d912daa48b0209dea871b854d8376 (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.txt | 40 |
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 |
