I am trying to implement a django formset (where user may dynamically add/remove forms from formset).
I use JS to add new rows (using empty_form):
$("#add-item").click(function(e){
e.preventDefault();
var count = parseInt($('#id_form-TOTAL_FORMS').val());
$('.invoice-items').append($('#empty_invoice_item').html().replace(/__prefix__/g, count));
$('#id_form-TOTAL_FORMS').attr('value', count+1);
$(".invoice-items .invoice-item .col-lg-9 .form-group:last-child").last().append('<a href="#" class="delete-item"><i class="glyphicon glyphicon-remove"></i></a>')
});
I also use JS to set DELETE flag on specific forms. Everything is passed to the view.
My view (part) code:
invoice_form = InvoiceForm()
invoice_item_helper = InvoiceItemHelper
InvoiceItemFormset = formset_factory(InvoiceItemForm, extra=0, max_num=15, validate_max=True, min_num=1, validate_min=True, can_delete=True)
formset = InvoiceItemFormset()
if request.method == 'POST':
invoice_form = InvoiceForm(request.POST)
formset = InvoiceItemFormset(request.POST)
The problem is, django always displays all forms in the formset, even those marked for deletion. So, even there is something wrong in my invoice form and it doesn't validate, it will show invoice form with error message AND all forms (once again).
How can I remove completely forms which are marked for deletion in if request.method == 'POST':
block? Is it possible?
It's dependent on how you render the forms, but you can check the field form.DELETE in the template and if it's set, render that form hidden for display and the data will be passed along until the data is processed (when all other forms are valid). It will also make sure form prefixes and indexes for the formset is intact.
When a formset is validated it will ignore forms marked for deletion. formset.is_valid
You can also pick up which forms are deleted in the view using deleted_forms and perhaps process them, still you will have to rebuild the whole formset without the deleted forms to maintain indexes and the count of forms. I personally found out that doing that is complex and leads to complicated code.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With