Django Crispy Forms Добавить новую пустую форму в ModelFormSet
Какой самый свежий способ добавить новую пустую форму в набор моделей с существующими формами?
forms.py:
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = '__all__'
MyFormSet = modelformset_factory(MyModel, extra=1, exclude=(), form=MyForm)
class MyFormsetHelper(FormHelper):
def __init__(self, *args, **kwargs):
super(MyFormsetHelper, self).__init__(*args, **kwargs)
self.form_method = 'post'
self.template = 'bootstrap/table_inline_formset.html'
self.add_input(Submit("submit", "Save"))
self.add_input(Button("add", "Add New"))
шаблон:
{% extends "base.html" %}
{% load staticfiles %}
{% load crispy_forms_tags %}
{% block stylesheets %}
{{ block.super }}
{% endblock stylesheets %}
{% block content %}
{% crispy formset helper %}
{% endblock content %}
У меня есть кнопка добавления, но я не вижу, как связать это с действием. Я также не знаю, как хрустящие формы создали бы пустую форму. До открытия хрустящих форм я выписывал весь код шаблона и использовал что-то похожее на приведенное ниже для визуализации пустой формы.
<div id="empty_form" style="display:none">
<table class='no_error'>
<tr>
<td>{{ modelformset.empty_form.Field1 }}</td>
<td>{{ modelformset.empty_form.Field2 }}</td>
<td>{{ modelformset.empty_form.Field3 }}</td>
</tr>
</table>
</div>
<input type="button" value="Add" id="add_more">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script>
$('#add_more').click(function() {
var form_idx = $('#id_form-TOTAL_FORMS').val();
$('#form_set').append($('#empty_form').html().replace(/__prefix__/g, form_idx));
$('#id_form-TOTAL_FORMS').val(parseInt(form_idx) + 1);
});
</script>
Если нет четкого способа сделать это, есть ли способ объединить код выше с четким набором форм? Я пытался, но ничего не происходит.
Спасибо за любую информацию, которую вы все могли бы иметь.
1 ответ
Я использую этот код, и он отлично работает...
кнопка
<input type="button" value="Add" id="add_more" onclick="add_form('empty_form')">
JavaScript
<script>
function add_form(formset) {
let total = $("#id_" + formset + "-TOTAL_FORMS").val();
let row = $("#" + formset + "_table tr:last")[0]; // find row to copy
let table = $("#" + formset + "_table tbody")[0]; // find table to append to
let clone = row.cloneNode(true); // copy children too
clone.innerHTML = clone.innerHTML.replaceAll("-" + (total - 1) + "-", "-" + total + "-");
table.appendChild(clone); // add new row to end of table
$("#id_" + formset + "-TOTAL_FORMS").val(++total);
}
</script>