Skip to content

Instantly share code, notes, and snippets.

@AndrewIngram
Last active December 11, 2015 11:39
Show Gist options
  • Save AndrewIngram/4595457 to your computer and use it in GitHub Desktop.
Save AndrewIngram/4595457 to your computer and use it in GitHub Desktop.
Possible EditInPlaceMixin for Django's class-based views. Useful for AJAX requests where on successful POST you render a detail template rather than doing a redirect. Unsuccessful POSTs return the form template as normal but with a 400 response code. Should work with Django's existing FormView and ModelFormView, as well as all the formset-relate…
from django.core.exceptions import ImproperlyConfigured
class EditInPlaceMixin(object):
detail_template_name = None
def get_detail_template_names(self):
"""
Returns a list of template names to be used for the request. Must return
a list. May not be called if render_to_detail_response is overridden.
"""
if self.detail_template_name is None:
raise ImproperlyConfigured(
"EditInPlaceMixin requires either a definition of "
"'detail_template_name' or an implementation of 'get_detail_template_name()'")
else:
return [self.detail_template_name]
def render_to_detail_response(self, context, **response_kwargs):
return self.response_class(
request = self.request,
template = [self.detail_template_name],
context = context,
**response_kwargs
)
def form_valid(self, form):
try:
self.object = form.save()
except AttributeError:
pass
return self.render_to_detail_response(self.get_context_data())
def form_invalid(self, form):
return self.render_to_response(self.get_context_data(form=form), status_code=400)
def forms_valid(self, form, formsets):
try:
self.object = form.save()
except AttributeError:
pass
for formset in inlines:
try:
formset.save()
except AttributeError:
pass
return self.render_to_detail_response(self.get_context_data())
def forms_invalid(self form, formsets):
return self.render_to_response(self.get_context_data(form=form, formsets=formsets), status_code=400)
def formset_valid(self, formset):
try:
self.object_list = formset.save()
except AttributeError:
pass
return self.render_to_detail_response(self.get_context_data())
def formset_invalid(self, formset):
return self.render_to_response(self.get_context_data(formsets=formsets), status_code=400)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment