Create a gist now

Instantly share code, notes, and snippets.

@neara /
Last active Dec 10, 2017

What would you like to do?
Django Class Based Views and Inline Formset Example
from django.forms import ModelForm
from django.forms.models import inlineformset_factory
from models import Sponsor, Sponsorship
class SponsorForm(ModelForm):
class Meta:
model = Sponsor
class SponsorshipForm(ModelForm):
class Meta:
model = Sponsorship
SponsorShipsFormSet = inlineformset_factory(Sponsor, Sponsorship,
form=SponsorshipForm, extra=2)
from django.db import transaction
from django.views.generic import CreateView
from forms import SponsorForm, SponsorShipsFormSet
class CreateSponsor(SponsorMixin, CreateView):
form_class = SponsorForm
template_name = 'sponsor_form.html'
def get_context_data(self, **kwargs):
data = super(CreateSponsor, self).get_context_data(**kwargs)
if self.request.POST:
data['sponsorships'] = SponsorShipsFormSet(self.request.POST)
data['sponsorships'] = SponsorShipsFormSet()
return data
def form_valid(self, form):
context = self.get_context_data()
sponsorships = context['sponsorships']
with transaction.commit_on_success():
form.instance.created_by = self.request.user
form.instance.updated_by = self.request.user
self.object =
if sponsorships.is_valid():
sponsorships.instance = self.object
return super(CreateSponsor, self).form_valid(form)
def get_success_url(self):
return reverse('sponsors')

You have save my life. Why isn't this a more obvious process?

BTW, is there any reason you use get_context_data() to instantiate the formset, instead of just doing it directly in form_valid()?

SponsorMixin? What is that mean?

Thanks! I had to change this to pass instance=self.object when initializing the formset.

@rmosologo Is the relationship between Sponsor and Sponsorship are one-to-many or one-to-one? and What is SponsorMixin?

What the hell is SponsorMixin?

Can I use it for updating multiple entries at the same time? If so, can anyone refer me to a good tutorial?

Any luck finding how we use this with UpdateView instead of just CreateView, so that we update also stuff?

tonysyu commented Jun 6, 2017

@koslibpro: You can find an example with UpdateView here:

miguelcb84 commented Jun 16, 2017

In that case I guess you need to tell the formset to use the instance:

data['sponsorships'] = SponsorShipsFormSet(self.request.POST, instance=self.object)
data['sponsorships'] = SponsorShipsFormSet(instance=self.object)

leonardocintra commented Jun 30, 2017

My site is in error in UpdateView

form show duplicate

class ExameUrinaRotinaForm(forms.ModelForm):
     class Meta:
         model = ExameUrinaRotina
         exclude = ()

ExameUrinaRotinaFormSet = inlineformset_factory(Laudo, ExameUrinaRotina, form=ExameUrinaRotinaForm, extra=1)

def get_context_data(self, **kwargs):
        context = super(UrinaRotinaUpdate, self).get_context_data(**kwargs)
        if self.request.POST:
            context['form_urina_rotina'] = ExameUrinaRotinaFormSet(self.request.POST, instance=self.object)
            context['form_urina_rotina'] = ExameUrinaRotinaFormSet(instance=self.object)
        return context


{{ form_urina_rotina.management_form }}

{% for form in form_urina_rotina %}
    <div class="form-group">
        <label class="col-sm-2 control-label">{{ form.volume.label }}</label>
        {{ form.volume }}
{% endfor %}

OmarNour commented Sep 6, 2017

can you show us sponsor_form.html ?

vmonteco commented Oct 3, 2017

Interesting and helpful, but is SponsorMixin specific to the case you used for the example or is it specific to the usage of inline_formsets with CreateView?

This thing is old now module 'django.db.transaction' has no attribute 'commit_on_success'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment