Исправлено удаление пустых форм: пересчёт индексов и TOTAL_FORMS
This commit is contained in:
@@ -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 как есть
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user