Search code examples
djangomodelforminline-formset

Creating a model and related models with Inline formsets


[I have posted this at the Django users | Google Groups also.]

Using the example in the inline formset docs, I am able to edit objects belonging a particular model (using modelforms). I have been trying to follow the same pattern for creating new objects using inline formsets, but have been unable to clear my head enough to bring out a working view for this purpose.

Using the same example as in the above link, how would I go about creating a new instance of an "Author" model together with its related "Book" objects?


Solution

  • First, create a Author model form.

    author_form = AuthorModelForm()
    

    then create a dummy author object:

    author = Author()
    

    Then create a inline formset using the dummy author like so:

    formset = BookFormSet(instance=author)  #since author is empty, this formset will just be empty forms
    

    Send that off to a template. After the data is returned back to the view, you create the Author:

    author = AuthorModelForm(request.POST)
    created_author = author.save()  # in practice make sure it's valid first
    

    Now hook the inline formset in with the newly created author and then save:

    formset = BookFormSet(request.POST, instance=created_author)
    formset.save()   #again, make sure it's valid first
    

    edit:

    To have no checkboxes on new forms, do this is a template:

    {% for form in formset.forms %}
        <table>
        {% for field in form %}
            <tr><th>{{field.label_tag}}</th><td>{{field}}{{field.errors}}</td></tr>
        {% endfor %}
    
        {% if form.pk %} {# empty forms do not have a pk #}
             <tr><th>Delete?</th><td>{{field.DELETE}}</td></tr>
        {% endif %}
        </table>
    {% endfor %}