Skip to content

Instantly share code, notes, and snippets.

@jaylett
Created February 17, 2011 12:58
Show Gist options
  • Save jaylett/831676 to your computer and use it in GitHub Desktop.
Save jaylett/831676 to your computer and use it in GitHub Desktop.
CBV for multi-form round trip
class WorkEditView(DetailDisplayView, ModelFormMixin):
"""Shows the edit page for a work."""
get_object = user_check("user_can_edit")(DetailDisplayView.get_object)
queryset = Work.objects.all()
template_resource_name = "work"
template_name = 'artists/work_edit.html'
def get(self, request, *args, **kwargs):
set_response_class("edit")
self.object = self.get_object()
return self.render_to_response(
self.get_context_data()
)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
forms = self.get_forms()
if not self.object.user_can_edit(self.request.user):
raise HttpForbidden()
if min(
map(
lambda x: x.is_valid(), forms.values()
)
):
# VALID!
work = forms['edit'].save()
del forms['edit']
# don't care about the other results
map(lambda x: x.save(), forms.values())
return HttpResponseRedirect(work.url.edit)
else:
# INVALID!
return self.render_to_response(self.get_context_data())
def get_context_data(self):
return {
'work': self.object,
'forms': self.get_forms(),
}
def get_forms(self):
MetadataEditFormSet = get_metadata_formset(self.object)
return {
'edit': WorkEditForm(prefix='edit', **self.get_form_kwargs()),
'metadata': MetadataEditFormSet(
prefix='metadata',
**FormMixin.get_form_kwargs(self)
),
'workartists': get_workartist_formset(self.object)(
prefix='workartists',
**FormMixin.get_form_kwargs(self)
),
'connections': get_connection_forward_formset(self.object)(
prefix='connections',
**FormMixin.get_form_kwargs(self)
),
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment