2015-08-06 17 views
5

Próbuję zaimplementować zestaw django (w którym użytkownik może dynamicznie dodawać/usuwać formularze z zestawu).Usuwanie formularza z zestawu Django

używam JS, aby dodać nowe wiersze (korzystając 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>') 
    }); 

Używam również JS ustawić flagę DELETE na konkretnych formach. Wszystko jest przekazywane do widoku.

Mój pogląd (część) Kod:

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) 

Problem polega na tym, Django zawsze wyświetla wszystkie formularze w formset, nawet te zaznaczone do usunięcia. Tak więc, nawet jeśli coś jest nie tak w mojej fakturze i nie zostanie zatwierdzone, pojawi się formularz faktury z komunikatem o błędzie I wszystkimi formularzami (po raz kolejny).

Jak mogę usunąć całkowicie formularze oznaczone do usunięcia w bloku if request.method == 'POST':? Czy to możliwe?

+1

Czy próbujesz usunąć formularze oznaczone do usunięcia po nieudanym POST lub po udanym POST? – spectras

+1

Jakiej wersji django używasz. Pokaż również pełny fragment kodu, w tym forms.py i views.py. –

Odpowiedz

6

Jest to zależne od sposobu renderowania formularzy, ale można sprawdzić w szablonie pole form.DELETE, a jeśli jest ustawione, wyrenderować ten formularz jako ukryty, a dane zostaną przekazane do momentu przetworzenia danych (gdy wszystkie inne formularze są ważne). Zapewni to także nienaruszone prefiksy formularzy i indeksy dla zestawu.

Po zatwierdzeniu zestawu formularzy zostaną zignorowane formularze oznaczone do usunięcia. formset.is_valid

Możesz także wybrać, które formularze zostaną usunięte w widoku, używając deleted_forms i być może je przetworzyć, ale będziesz musiał przebudować cały zestaw bez usuniętych formularzy, aby zachować indeksy i liczbę formularzy. Osobiście dowiedziałem się, że robienie tego jest skomplikowane i prowadzi do skomplikowanego kodu.

1

Django udostępnia funkcję dla-delecji, która powinna umożliwić prawidłowe usunięcie formularza: https://docs.djangoproject.com/en/1.8/topics/forms/formsets/#can-delete

W form-X-DELETE musi być ustawiony na jakąś wartość true jeśli oceniający. Domyślną wartością jest on, jak widać na przykładzie z dokumentacji:

>>> data = { 
...  'form-TOTAL_FORMS': '3', 
...  'form-INITIAL_FORMS': '2', 
...  'form-MAX_NUM_FORMS': '', 
...  'form-0-title': 'Article #1', 
...  'form-0-pub_date': '2008-05-10', 
...  'form-0-DELETE': 'on', 
...  'form-1-title': 'Article #2', 
...  'form-1-pub_date': '2008-05-11', 
...  'form-1-DELETE': '', 
...  'form-2-title': '', 
...  'form-2-pub_date': '', 
...  'form-2-DELETE': '', 
... } 

Więc jeśli to nie działa, być może nie są faktycznie wysyłania wartości do swojej form-X-DELETE? Zwróć uwagę, że podczas wysyłania usunięcia musisz podać rzeczywiste dane formularza. Samo podanie numeru formularza nie jest wystarczającą identyfikacją, aby Django ją zaakceptował.

Powiązane problemy