 <p>Ok, finally I got it running by making the models closer to what I wanted to present to the user. But related to the topic of the question :</p> <p><strong>1)</strong> Nested forms/formsets are not a built-in Django feature, are a pain to implement by yourself, and are actually not needed... Rather, one should use forms' and formsets' prefixes.</p> <p><strong>2)</strong> Trying to work with forms not based on the models, process the data, then reinject it in the models, is much much more code than modifying the models a little bit to have nice model-based forms. So what I did is I modified the models like that :</p> <pre><code>class PortConfig(Serializable): port = models.ForeignKey(Port, editable=False) machine = models.ForeignKey("vmm.machine", editable=False) is_open = models.CharField(max_length=16, default="not_open", choices=is_open_choices) class Rule(Serializable): ip_source = models.CharField(max_length=24) port_config = models.ForeignKey(PortConfig) </code></pre> <p>Then I simply used a "model formset" for <code>PortConfig</code>, and "model inline formset" for <code>Rule</code>, with a <code>PortConfig</code> as foreign key, and it went perfectly</p> <p><strong>3)</strong> I used this great JS library <a href="http://code.google.com/p/django-dynamic-formset/" rel="nofollow noreferrer">http://code.google.com/p/django-dynamic-formset/</a> to put the "add field" and "delete field" links ... you almost have nothing to do.</p>