So mache ich es mit jQuery :
Meine Vorlage:
<h3>My Services</h3>
{{ serviceFormset.management_form }}
{% for form in serviceFormset.forms %}
<div class='table'>
<table class='no_error'>
{{ form.as_table }}
</table>
</div>
{% endfor %}
<input type="button" value="Add More" id="add_more">
<script>
$('#add_more').click(function() {
cloneMore('div.table:last', 'service');
});
</script>
In einer Javascript-Datei:
function cloneMore(selector, type) {
var newElement = $(selector).clone(true);
var total = $('#id_' + type + '-TOTAL_FORMS').val();
newElement.find(':input').each(function() {
var name = $(this).attr('name').replace('-' + (total-1) + '-','-' + total + '-');
var id = 'id_' + name;
$(this).attr({'name': name, 'id': id}).val('').removeAttr('checked');
});
newElement.find('label').each(function() {
var newFor = $(this).attr('for').replace('-' + (total-1) + '-','-' + total + '-');
$(this).attr('for', newFor);
});
total++;
$('#id_' + type + '-TOTAL_FORMS').val(total);
$(selector).after(newElement);
}
Was es macht:
cloneMoreakzeptiert selectorals erstes Argument und das typevon formset als zweites. Was das selectortun sollte, ist es zu übergeben, was es duplizieren sollte. In diesem Fall übergebe ich es div.table:lastso, dass jQuery nach der letzten Tabelle mit einer Klasse von sucht table. Der :lastTeil davon ist wichtig, da der selectorauch verwendet wird, um zu bestimmen, wonach das neue Formular eingefügt wird. Höchstwahrscheinlich möchten Sie es am Ende der restlichen Formulare. Das typeArgument ist, dass wir insbesondere das management_formFeld TOTAL_FORMSsowie die tatsächlichen Formularfelder aktualisieren können . Wenn Sie ein Formularset mit beispielsweise ClientModellen haben, haben die Verwaltungsfelder IDs von id_clients-TOTAL_FORMSund id_clients-INITIAL_FORMS, während die Formularfelder das Format id_clients-N-fieldnamewith habenNist die Formularnummer, beginnend mit 0. Mit dem typeArgument prüft die cloneMoreFunktion also, wie viele Formulare derzeit vorhanden sind, und durchläuft jede Eingabe und Beschriftung im neuen Formular, wobei alle Feldnamen / IDs von so etwas wie id_clients-(N)-namebis id_clients-(N+1)-nameusw. ersetzt werden. Nachdem es fertig ist, aktualisiert es das TOTAL_FORMSFeld, um das neue Formular wiederzugeben, und fügt es am Ende des Satzes hinzu.
Diese Funktion ist für mich besonders hilfreich, da ich sie aufgrund ihrer Einrichtung in der gesamten App verwenden kann, wenn ich mehr Formulare in einem Formularsatz bereitstellen möchte, und kein verstecktes "Vorlagen" -Formular zum Duplizieren erforderlich bin Solange ich es übergebe, den Namen des Formularsatzes und das Format, in dem die Formulare angeordnet sind. Ich hoffe es hilft.