Created
May 30, 2019 14:09
-
-
Save gabrielfgularte/7186d2ee6c51276dc2ae4aea58e1ffa9 to your computer and use it in GitHub Desktop.
Django InlineFormView - handle multiple formsets in Class Based Views
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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