Mantis
Mantis

Reputation: 1387

Django: inlineformsets

I am trying to incorporate inline add to my django form. The User can create a 'Site', within the 'Site' form the user can create multible 'Staff' to that 'Site'.

I have followed a tutorial which I believe to be the solution but can not get it to work.

Currently I am getting the error:

'Calling modelformset_factory without defining 'fields' or 'exclude' explicitly is prohibited.'

Here is my attempt.

models.py

class Site(models.Model):
    ...

class Staff(models.Model):
    site = models.ForeignKey(Site)
    ....

views.py

class BaseNestedFormset(BaseInlineFormSet):
    def add_fields(self, form, index):
        # allow the super class to create the fields as usual
        super(BaseNestedFormset, self).add_fields(form, index)

        form.nested = self.nested_formset_class(
            instance=form.instance,
            data=form.data if self.is_bound else None,
            prefix=' %s-%s' % (
                form.prefix,
                self.nested_formset_class.get_default_prefix(),
            ),
        )

    def is_valid(self):
        result = super(BaseNestedFormset, self).is_valid()
        if self.is_bound:
            # look at any nested formsets, as well
            for form in self.forms:
                result = result and form.nested.is_valid()

        return result

    def save(self, commit=True):
        result = super(BaseNestedFormset, self).save(commit=commit)
        for form in self:
            form.nested.save(commit=commit)

        return result


def nested_formset_factory(site_model, staff_model):
    parent_child = inlineformset_factory(
        site_model,
        staff_model,
        formset=BaseNestedFormset,
    )

    parent_child.nested_formset_class = inlineformset_factory(
        staff_model,
    )

    return parent_child


class SiteCreate(CreateView):
    model = Site
    form_class = SiteForm
    queryset = Site.objects.all()
    success_url = '/site/list'

    def get_form_class(self):
        return nested_formset_factory(
            Site,
            Staff,
        )

forms.py

class SiteForm(forms.ModelForm):
    class Meta:
        model = Site
        exclude = ('creation', 'last_modified')

Upvotes: 0

Views: 1004

Answers (1)

user3972986
user3972986

Reputation: 500

def nested_formset_factory(site_model, staff_model):
    parent_child = inlineformset_factory(
        site_model,
        staff_model,
        formset=BaseNestedFormset,
        fields = ('one', 'two', 'ect')
    )

Upvotes: 2

Related Questions