Удаление формы из набора форм Django

Я пытаюсь реализовать набор форм Django (где пользователь может динамически добавлять / удалять формы из набора форм).

Я использую JS для добавления новых строк (используя 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>')
    });

Я также использую JS для установки флага DELETE в определенных формах. Все передано на вид.

Мой взгляд (часть) код:

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)

Проблема в том, что django всегда отображает все формы в наборе форм, даже те, которые отмечены для удаления. Таким образом, даже если что-то не так в моей форме счета-фактуры, и она не проверяется, она покажет форму счета-фактуры с сообщением об ошибке И все формы (еще раз).

Как я могу полностью удалить формы, помеченные для удаления в if request.method == 'POST': блок? Является ли это возможным?

2 ответа

Решение

Это зависит от того, как вы визуализируете формы, но вы можете проверить поле формы. УДАЛИТЬ в шаблоне и, если он установлен, сделать эту форму скрытой для отображения, и данные будут передаваться до тех пор, пока данные не будут обработаны (когда все другие формы действует). Это также гарантирует, что префиксы форм и индексы для набора форм не повреждены.

Когда форма проверена, она игнорирует формы, помеченные для удаления. formset.is_valid

Вы также можете выбрать, какие формы удаляются в представлении, используя удаленные_формы, и, возможно, обработать их, тем не менее вам придется перестроить весь набор форм без удаленных форм, чтобы сохранить индексы и количество форм. Я лично узнал, что делать это сложно и приводит к сложному коду.

Django предоставляет функцию для удаления, которая должна обеспечить правильное удаление вашей формы: https://docs.djangoproject.com/en/1.8/topics/forms/formsets/

form-X-DELETE хотя должно быть установлено какое-то значение, оцениваемое как true. По умолчанию onКак видно из примера из документации:

>>> 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': '',
... }

Так что, если это не работает, возможно, вы на самом деле не отправляете значение form-X-DELETE? Обратите внимание, что вам нужно указать фактические данные формы при отправке удаления. Одной только отправки номера формы недостаточно, чтобы Джанго мог ее принять.

Кажется, что FormSet не предоставляет метода для удаления формы.

Другие вопросы по тегам