From a3f5ac4c089a345d710b47352e167267793f924d Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Tue, 25 Nov 2025 19:49:58 +0300 Subject: [PATCH] Fix: Enable autosave for delivery address fields with partial data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Исправлена проблема с автосохранением полей адреса доставки. Теперь адрес сохраняется при заполнении любого поля, а не только при наличии улицы и номера дома. Изменения в Backend (address_service.py): - Изменена логика валидации в process_address_from_form() - Теперь адрес сохраняется если заполнено хотя бы одно поле - Удалено жёсткое требование заполнения street и building_number - Проверяем наличие данных во всех полях адреса Изменения в Frontend (autosave.js): - Переработана логика сбора данных адреса - address_mode='new' устанавливается при заполнении любого поля адреса - Все непустые поля адреса отправляются на сервер - Используется более элегантный подход с Object.values() и .some() Теперь автосохранение работает корректно: - Заполнение поля "Улица" → автосохранение срабатывает - Заполнение "Номер дома" → автосохранение срабатывает - Заполнение любого другого поля адреса → автосохранение срабатывает - После перезагрузки страницы все данные восстанавливаются 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- myproject/orders/services/address_service.py | 18 +++++-- myproject/orders/static/orders/js/autosave.js | 53 +++++++++---------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/myproject/orders/services/address_service.py b/myproject/orders/services/address_service.py index b9e6c5d..53e3855 100644 --- a/myproject/orders/services/address_service.py +++ b/myproject/orders/services/address_service.py @@ -74,11 +74,23 @@ class AddressService: street = form_data.get('address_street', '').strip() building_number = form_data.get('address_building_number', '').strip() - if not street or not building_number: - # Если обязательные поля не заполнены, возвращаем None + # Для автосохранения разрешаем сохранять адрес даже если не все поля заполнены + # Проверяем только что хотя бы одно поле адреса заполнено + has_any_address_data = any([ + street, + building_number, + form_data.get('address_apartment_number', '').strip(), + form_data.get('address_entrance', '').strip(), + form_data.get('address_floor', '').strip(), + form_data.get('address_intercom_code', '').strip(), + form_data.get('address_delivery_instructions', '').strip(), + ]) + + if not has_any_address_data: + # Если все поля адреса пустые, возвращаем None return None - # Создаем новый адрес + # Создаем новый адрес (даже если не все обязательные поля заполнены) address = AddressService.create_address_from_form_data(form_data) return address diff --git a/myproject/orders/static/orders/js/autosave.js b/myproject/orders/static/orders/js/autosave.js index 033195a..8e589fc 100644 --- a/myproject/orders/static/orders/js/autosave.js +++ b/myproject/orders/static/orders/js/autosave.js @@ -371,40 +371,37 @@ // Поля адреса доставки (новая логика с прямым вводом) const addressStreetField = form.querySelector('input[name="address_street"]'); - if (addressStreetField && addressStreetField.value) { - data.address_street = addressStreetField.value; - // Указываем режим "новый адрес" если есть улица - data.address_mode = 'new'; - } - const addressBuildingField = form.querySelector('input[name="address_building_number"]'); - if (addressBuildingField && addressBuildingField.value) { - data.address_building_number = addressBuildingField.value; - } - const addressApartmentField = form.querySelector('input[name="address_apartment_number"]'); - if (addressApartmentField && addressApartmentField.value) { - data.address_apartment_number = addressApartmentField.value; - } - const addressEntranceField = form.querySelector('input[name="address_entrance"]'); - if (addressEntranceField && addressEntranceField.value) { - data.address_entrance = addressEntranceField.value; - } - const addressFloorField = form.querySelector('input[name="address_floor"]'); - if (addressFloorField && addressFloorField.value) { - data.address_floor = addressFloorField.value; - } - const addressIntercomField = form.querySelector('input[name="address_intercom_code"]'); - if (addressIntercomField && addressIntercomField.value) { - data.address_intercom_code = addressIntercomField.value; - } - const addressInstructionsField = form.querySelector('textarea[name="address_delivery_instructions"]'); - if (addressInstructionsField && addressInstructionsField.value) { - data.address_delivery_instructions = addressInstructionsField.value; + + // Собираем все поля адреса + const addressFields = { + address_street: addressStreetField?.value || '', + address_building_number: addressBuildingField?.value || '', + address_apartment_number: addressApartmentField?.value || '', + address_entrance: addressEntranceField?.value || '', + address_floor: addressFloorField?.value || '', + address_intercom_code: addressIntercomField?.value || '', + address_delivery_instructions: addressInstructionsField?.value || '', + }; + + // Проверяем, заполнено ли хотя бы одно поле адреса + const hasAnyAddressData = Object.values(addressFields).some(value => value.trim() !== ''); + + if (hasAnyAddressData) { + // Указываем режим "новый адрес" если заполнено хотя бы одно поле + data.address_mode = 'new'; + + // Добавляем все непустые поля в данные + Object.entries(addressFields).forEach(([key, value]) => { + if (value.trim() !== '') { + data[key] = value; + } + }); } const addressConfirmField = form.querySelector('input[name="address_confirm_with_recipient"]');