How to put an InlineFormSet into a ModelFormSet in Django?
I'd like to display a number of forms via a ModelFormSet
where each one of the forms displays in turn InlineFormSets
for all objects connected to the object.
Now I'm not really sure how to provide the instances for each ModelFormSet
. I thought about subclassing BaseModelFormSet
but I have no clue on where to start and would like to know whether this is possible a开发者_如何学JAVAt all before I go through all the trouble.
Thanks in advance!
I found an article which focuses on the exact problem. It works fine!
http://yergler.net/blog/2009/09/27/nested-formsets-with-django/
For the sake of completeness I copied the code fragments:
class Block(models.Model):
description = models.CharField(max_length=255)
class Building(models.Model):
block = models.ForeignKey(Block)
address = models.CharField(max_length=255)
class Tenant(models.Model):
building = models.ForeignKey(Building)
name = models.CharField(max_length=255)
unit = models.CharField(max_length=255)
form django.forms.models import inlineformset_factory, BaseInlineFormSet
TenantFormset = inlineformset_factory(models.Building, models.Tenant, extra=1)
class BaseBuildingFormset(BaseInlineFormSet):
def add_fields(self, form, index):
# allow the super class to create the fields as usual
super(BaseBuildingFormset, self).add_fields(form, index)
# created the nested formset
try:
instance = self.get_queryset()[index]
pk_value = instance.pk
except IndexError:
instance=None
pk_value = hash(form.prefix)
# store the formset in the .nested property
form.nested = [
TenantFormset(data=self.data,
instance = instance,
prefix = 'TENANTS_%s' % pk_value)]
BuildingFormset = inlineformset_factory(models.Block, models.Building, formset=BaseBuildingFormset, extra=1)
As jnns said, you want to use inlineformset_factory
精彩评论