From 33533e6268f8469a2a514b9e71191f7b45956a2e Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Tue, 9 Dec 2025 00:53:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=83=D1=81=D1=82=D1=8B=D1=85=20=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC:=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D1=87=D1=91?= =?UTF-8?q?=D1=82=20=D0=B8=D0=BD=D0=B4=D0=B5=D0=BA=D1=81=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B8=20TOTAL=5FFORMS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orders/templates/orders/order_form.html | 52 +++++++++++++++++-- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/myproject/orders/templates/orders/order_form.html b/myproject/orders/templates/orders/order_form.html index a699d8c..254b5c5 100644 --- a/myproject/orders/templates/orders/order_form.html +++ b/myproject/orders/templates/orders/order_form.html @@ -856,9 +856,12 @@ document.addEventListener('DOMContentLoaded', function() { console.log('[Form Cleanup] Начало очистки пустых форм товаров'); // Находим все формы товаров - const itemForms = document.querySelectorAll('.order-item-form'); + const itemForms = Array.from(document.querySelectorAll('.order-item-form')); console.log('[Form Cleanup] Найдено форм:', itemForms.length); + // Собираем формы для удаления + const formsToRemove = []; + itemForms.forEach((form, formIndex) => { // Пропускаем уже удалённые формы if (form.classList.contains('deleted')) { @@ -901,15 +904,56 @@ document.addEventListener('DOMContentLoaded', function() { form.classList.add('deleted'); form.style.display = 'none'; } else { - console.log(` - Действие: удаляем из DOM (нет ID)`); - // Новая несохранённая форма — просто удаляем из DOM - form.remove(); + console.log(` - Действие: помечаем для удаления из formset (нет ID)`); + // Новая несохранённая форма — помечаем для удаления + formsToRemove.push(form); } } else { console.log(` - Действие: оставляем (не пустая, пойдёт на валидацию)`); } }); + // Удаляем помеченные формы и пересчитываем индексы + if (formsToRemove.length > 0) { + console.log(`[Form Cleanup] Удаление ${formsToRemove.length} пустых форм...`); + + // Удаляем формы из DOM + formsToRemove.forEach(form => form.remove()); + + // Обновляем TOTAL_FORMS + const totalFormsInput = document.querySelector('[name="items-TOTAL_FORMS"]'); + if (totalFormsInput) { + const oldTotal = parseInt(totalFormsInput.value); + const newTotal = oldTotal - formsToRemove.length; + console.log(`[Form Cleanup] Обновление TOTAL_FORMS: ${oldTotal} → ${newTotal}`); + totalFormsInput.value = newTotal; + } + + // Пересчитываем индексы оставшихся форм + const remainingForms = Array.from(document.querySelectorAll('.order-item-form:not(.deleted)')); + console.log(`[Form Cleanup] Пересчёт индексов для ${remainingForms.length} оставшихся форм...`); + + remainingForms.forEach((form, newIndex) => { + // Находим все поля с name="items-N-..." + const fields = form.querySelectorAll('[name^="items-"]'); + fields.forEach(field => { + const name = field.getAttribute('name'); + // Меняем индекс: items-СТАРЫЙ-поле → items-НОВЫЙ-поле + const newName = name.replace(/^items-\d+/, `items-${newIndex}`); + if (name !== newName) { + console.log(`[Form Cleanup] Переименование: ${name} → ${newName}`); + field.setAttribute('name', newName); + + // Обновляем ID тоже (для связи с label) + if (field.id) { + const newId = field.id.replace(/^id_items-\d+/, `id_items-${newIndex}`); + field.setAttribute('id', newId); + } + } + }); + }); + } + console.log('[Form Cleanup] Очистка завершена'); // Всё остальное идёт на валидацию Django как есть });