Agregue un formulario dynamic a un formset django usando javascript de una manera correcta

¿Cómo agregar una forma dinámica a un conjunto de formularios django en plantillas sin copias molestas de la salida de la plantilla html?

Tengo un conjunto de formularios con un recuento desconocido de formularios de resultados, y necesito agregar algunos formularios directamente en la plantilla presionando un botón.

Esta auto-respuesta se basa en este post de Nick Lang, pero vamos a simplificarlo de esta manera y ya no necesitamos copiar / pegar todo el formulario html.

Tenemos un formset en línea que se crea en una vista como esta:

items_formset = inlineformset_factory(Parent, Item, form=ItemForm, extra=1) item_forms = items_formset() 

A continuación, debemos crear una plantilla para nuestro formulario formset, podemos hacerlo usando la propiedad empty_form de la instancia de formset, que genera una plantilla de formulario html donde cada número de “id” de un formulario se reemplaza por __prefix__ string, por ejemplo:

  {% crispy item_forms.empty_form item_forms.form.helper %} #} --> 

Entonces, primero necesitamos reemplazar este __prefix__ por una identificación y agregar un formulario usando esta plantilla.
Aquí hay un fragmento de código de plantilla de formulario, que podemos usar para crear nuevos elementos:

  

Luego tenemos que mostrar la parte principal del formulario:

 
{% csrf_token %} {{ item_forms.management_form }}
{% for item_form in item_forms %}
{{ item_form.id }} {{ item_form.as_p }} {# {% crispy item_form %} #}
{% endfor %}
Add Item

Finalmente, necesitamos agregar algunos JS (jquery, probado con 1.9.1 y 2.1.0) para agregar el siguiente formulario formset. Tenga en cuenta que no usaremos underscore.js , ya que no es necesario en este caso: simplemente haga clic aquí para reemplazar __prefix__ por el siguiente número de “identificación”)

  

Eso es todo, simplemente haga clic en el botón “Agregar elemento” y aparecerá un nuevo elemento de formset.

Asegúrese de reemplazar esta muestra por su nombre de aplicación / nombre de modelo.