Ответ 1
Этот автоответ основан на этом сообщении Ником Лангом, но мы собираемся упростить этот путь, и нам не нужно копировать/вставлять всю форму html больше.
У нас есть встроенный набор форм, который создается в виде следующего вида:
items_formset = inlineformset_factory(Parent, Item, form=ItemForm, extra=1)
item_forms = items_formset()
Затем нам нужно создать шаблон для формы formet, мы можем сделать это, используя свойство empty_form
экземпляра formet, который генерирует шаблон формы html, где каждый "id" номер формы заменяется на __prefix__
строка, например:
<!--
{{ item_forms.empty_form }}
{# <!-- or for crispy forms --> {% crispy item_forms.empty_form item_forms.form.helper %} #}
-->
Итак, сначала нам нужно заменить этот __prefix__
на id и добавить форму, используя этот шаблон.
Вот фрагмент кода шаблона формы, который мы можем использовать для создания новых элементов:
<script type="text/html" id="item-template">
<div id="item-__prefix__">
{{ item_forms.empty_form }}
<!-- crispy: {% crispy item_forms.empty_form item_forms.form.helper %} -->
</div>
</script>
Затем нам нужно отобразить основную часть формы:
<form action="" method="post">
{% csrf_token %}
{{ item_forms.management_form }}
<div id="items-form-container">
{% for item_form in item_forms %}
<div id="item-{{ forloop.counter0 }}">
{{ item_form.id }}
{{ item_form.as_p }}
{# <!-- or for crispy forms --> {% crispy item_form %} #}
</div>
{% endfor %}
</div>
<a href="#" id="add-item-button" class="btn btn-info add-item">Add Item</a>
</form>
Наконец, нам нужно добавить JS (jquery, проверено с 1.9.1 и 2.1.0), чтобы добавить следующую форму формы. Обратите внимание, что мы не будем использовать underscore.js
, так как в этом случае он не нужен: просто str.replace, чтобы заменить __prefix__
на следующий номер "id" )
<script>
$(document).ready(function() {
$('.add-item').click(function(ev) {
ev.preventDefault();
var count = $('#items-form-container').children().length;
var tmplMarkup = $('#item-template').html();
var compiledTmpl = tmplMarkup.replace(/__prefix__/g, count);
$('div#items-form-container').append(compiledTmpl);
// update form count
$('#id_item_items-TOTAL_FORMS').attr('value', count+1);
// some animate to scroll to view our new form
$('html, body').animate({
scrollTop: $("#add-item-button").position().top-200
}, 800);
});
});
</script>
Чтобы все это, просто нажмите кнопку "Добавить элемент", и появится новый элемент формы.
Обязательно замените этот образец на имя вашего приложения/model_name.