diff --git a/myproject/orders/forms.py b/myproject/orders/forms.py index 6fb01e1..35bae07 100644 --- a/myproject/orders/forms.py +++ b/myproject/orders/forms.py @@ -200,6 +200,9 @@ class OrderForm(forms.ModelForm): Логика: - Если delivery_cost заполнено → используется ручное значение (is_custom_delivery_cost = True) - Если delivery_cost пустое → автоматический расчет (is_custom_delivery_cost = False) + + ВАЖНО: reset_delivery_cost() вызывается только при commit=True, + т.к. требует наличия сохраненных items в БД. """ instance = super().save(commit=False) @@ -210,8 +213,12 @@ class OrderForm(forms.ModelForm): # Ручное значение указано instance.set_delivery_cost(delivery_cost, is_custom=True) else: - # Пустое поле или 0 → автоматический расчет - instance.reset_delivery_cost() + # Пустое поле или 0 → помечаем что нужен автоматический расчет + # НО не вызываем reset_delivery_cost() если commit=False! + instance.is_custom_delivery_cost = False + if commit: + # Автоматический расчет только при commit=True + instance.reset_delivery_cost() if commit: instance.save() diff --git a/myproject/orders/views.py b/myproject/orders/views.py index db3273a..18c0bd1 100644 --- a/myproject/orders/views.py +++ b/myproject/orders/views.py @@ -68,6 +68,7 @@ def order_create(request): payment_formset = PaymentFormSet(request.POST) if form.is_valid() and formset.is_valid() and payment_formset.is_valid(): + # Сохраняем форму БЕЗ commit, чтобы не вызывать reset_delivery_cost() до сохранения items order = form.save(commit=False) # Обрабатываем адрес доставки @@ -89,6 +90,7 @@ def order_create(request): # Кнопка "Создать заказ" - статус из формы или NULL order.modified_by = request.user + # Сохраняем заказ в БД (теперь у него есть pk) order.save() # Сохраняем позиции заказа @@ -99,6 +101,11 @@ def order_create(request): payment_formset.instance = order payment_formset.save() + # Пересчитываем стоимость доставки если она не установлена вручную + delivery_cost = form.cleaned_data.get('delivery_cost') + if not delivery_cost or delivery_cost <= 0: + order.reset_delivery_cost() + # Пересчитываем итоговую сумму order.calculate_total() order.save()