Исправлено удаление пустых форм: пересчёт индексов и TOTAL_FORMS

This commit is contained in:
2025-12-09 00:53:03 +03:00
parent 91383a2bf7
commit 33533e6268

View File

@@ -856,9 +856,12 @@ document.addEventListener('DOMContentLoaded', function() {
console.log('[Form Cleanup] Начало очистки пустых форм товаров'); 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); console.log('[Form Cleanup] Найдено форм:', itemForms.length);
// Собираем формы для удаления
const formsToRemove = [];
itemForms.forEach((form, formIndex) => { itemForms.forEach((form, formIndex) => {
// Пропускаем уже удалённые формы // Пропускаем уже удалённые формы
if (form.classList.contains('deleted')) { if (form.classList.contains('deleted')) {
@@ -901,15 +904,56 @@ document.addEventListener('DOMContentLoaded', function() {
form.classList.add('deleted'); form.classList.add('deleted');
form.style.display = 'none'; form.style.display = 'none';
} else { } else {
console.log(` - Действие: удаляем из DOM (нет ID)`); console.log(` - Действие: помечаем для удаления из formset (нет ID)`);
// Новая несохранённая форма — просто удаляем из DOM // Новая несохранённая форма — помечаем для удаления
form.remove(); formsToRemove.push(form);
} }
} else { } else {
console.log(` - Действие: оставляем (не пустая, пойдёт на валидацию)`); 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] Очистка завершена'); console.log('[Form Cleanup] Очистка завершена');
// Всё остальное идёт на валидацию Django как есть // Всё остальное идёт на валидацию Django как есть
}); });