Search code examples
djangoformsdjango-formsnested-formsformsets

Render Django formset as array


I have a model and i need to create form with multiple instances in it. To be more specific: i need to render my ModelForm inside regular form with square brackets next to it's fields names. Something like this in magicworld:

forms.py

class ManForm(ModelForm):
    class Meta:
        model = Man
        fields = ['name', 'age']

class PeopleForm(forms.Form):
    # modelless form
    people = ??? # array of ManForm instances or something

form.html

<form action="/people/create/">
    {{ form }}
</form>

output

<form action="/people/create/">
    <input type="text" name="name[0]"/>
    <input type="text" name="age[0]"/>
</form>

To tell you the truth, i don't know how to approach this problem at all. I tried modelformset_factory, but all i've got is <input type="text" name="form-0-name"/>


Solution

  • As discussed in the comments, you need a formset.

    def create_people(request):
        PeopleFormSet = modelformset_factory(Man, form=ManForm)
        if request.method == 'POST':
            formset = PeopleFormSet(request.POST)
            if formset.is_valid():
                for form in formset:
                    ... do something with individual form
        else:
            formset = PeopleFormSet()
        return render(request, template_name, {'formset': formset}