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:
cloneMore
akzeptiert selector
als erstes Argument und das type
von formset als zweites. Was das selector
tun sollte, ist es zu übergeben, was es duplizieren sollte. In diesem Fall übergebe ich es div.table:last
so, dass jQuery nach der letzten Tabelle mit einer Klasse von sucht table
. Der :last
Teil davon ist wichtig, da der selector
auch verwendet wird, um zu bestimmen, wonach das neue Formular eingefügt wird. Höchstwahrscheinlich möchten Sie es am Ende der restlichen Formulare. Das type
Argument ist, dass wir insbesondere das management_form
Feld TOTAL_FORMS
sowie die tatsächlichen Formularfelder aktualisieren können . Wenn Sie ein Formularset mit beispielsweise Client
Modellen haben, haben die Verwaltungsfelder IDs von id_clients-TOTAL_FORMS
und id_clients-INITIAL_FORMS
, während die Formularfelder das Format id_clients-N-fieldname
with habenN
ist die Formularnummer, beginnend mit 0
. Mit dem type
Argument prüft die cloneMore
Funktion 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)-name
bis id_clients-(N+1)-name
usw. ersetzt werden. Nachdem es fertig ist, aktualisiert es das TOTAL_FORMS
Feld, 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.