views:

320

answers:

1

Hi,

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 at all before I go through all the trouble.

Thanks in advance!

A: 

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)
Jannis