-
-
Save neara/6209563 to your computer and use it in GitHub Desktop.
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(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) | |
else: | |
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 = form.save() | |
if sponsorships.is_valid(): | |
sponsorships.instance = self.object | |
sponsorships.save() | |
return super(CreateSponsor, self).form_valid(form) | |
def get_success_url(self): | |
return reverse('sponsors') |
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?
@koslibpro: You can find an example with UpdateView
here: https://github.com/timhughes/django-cbv-inline-formset
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)
My site is in error in UpdateView
forms.py
class ExameUrinaRotinaForm(forms.ModelForm):
class Meta:
model = ExameUrinaRotina
exclude = ()
ExameUrinaRotinaFormSet = inlineformset_factory(Laudo, ExameUrinaRotina, form=ExameUrinaRotinaForm, extra=1)
views.py
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'].full_clean()
else:
context['form_urina_rotina'] = ExameUrinaRotinaFormSet(instance=self.object)
return context
urina_rotina_update.html
{{ 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 }}
</div>
{% endfor %}
can you show us sponsor_form.html ?
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'
SponsorForm get saved even though SponsorShipsFormSet are invalid
Maybe this update helps:
def form_valid(self, form):
context = self.get_context_data()
sponsorships = context['sponsorships']
with transaction.atomic():
form.instance.created_by = self.request.user
form.instance.updated_by = self.request.user
self.object = form.save()
if sponsorships.is_valid():
sponsorships.instance = self.object
sponsorships.save()
return super(CreateSponsor, self).form_valid(form)
What the hell is SponsorMixin?
He's not actually using that in his code but it's basically an input parameter.
Do you guys know how to implement update_or_create method for inline model to exclude possibility of adding 2 or more similar instances?
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()?