Skip to content

Instantly share code, notes, and snippets.

@gabrielfgularte
Created May 30, 2019 14:09
Show Gist options
  • Save gabrielfgularte/7186d2ee6c51276dc2ae4aea58e1ffa9 to your computer and use it in GitHub Desktop.
Save gabrielfgularte/7186d2ee6c51276dc2ae4aea58e1ffa9 to your computer and use it in GitHub Desktop.
Django InlineFormView - handle multiple formsets in Class Based Views
class InlineFormView():
formsets = []
def get_formsets(self):
if not self.formsets:
raise ValueError('InlineFormView needs a "formsets" property.')
return self.formsets
def get_context_data(self, **kwargs):
data = super(InlineFormView, self).get_context_data(**kwargs)
for form in self.get_formsets():
if self.request.POST:
data[form[0]] = form[1](self.request.POST, instance=self.object)
else:
data[form[0]] = form[1](instance=self.object)
return data
def form_valid(self, form):
context = self.get_context_data()
with transaction.atomic():
self.object = form.save()
for formset in self.get_formsets():
form_data = context[formset[0]]
if form_data.is_valid():
form_data.instance = self.object
form_data.save()
return super(InlineFormView, self).form_valid(form)
from base_views import InlineFormView
from forms import FormSet1, FormSet2
class MyView(InlineFormView, UpdateView):
formsets = [('formset1', FormSet1), ('formset2', FormSet2)]
model = MyModel
template_name = 'example/tpl.html'
fields = ['title', 'description']
success_url = reverse_lazy('my_app:my_view')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment