Добавлена функциональность редактирования заказов с обновлением резервов товаров

This commit is contained in:
2025-11-27 21:13:42 +03:00
parent da5d4001b5
commit 82ed5a409e
6 changed files with 296 additions and 113 deletions

View File

@@ -143,6 +143,7 @@ class OrderForm(forms.ModelForm):
'class': 'form-select select2',
'data-placeholder': 'Выберите адрес доставки'
})
# Адрес доставки не обязателен при редактировании (создаётся из отдельных полей)
self.fields['delivery_address'].required = False
self.fields['pickup_warehouse'].widget.attrs.update({
@@ -221,9 +222,16 @@ class OrderForm(forms.ModelForm):
class OrderItemForm(forms.ModelForm):
"""Форма для позиции заказа"""
# Элегантно переопределяем поле формы, чтобы парсить '277,00' как Decimal
price = forms.CharField(
required=False,
widget=forms.TextInput(attrs={'class': 'form-control', 'step': '0.01', 'min': '0'})
)
class Meta:
model = OrderItem
fields = ['product', 'product_kit', 'quantity', 'price', 'is_custom_price']
# ВАЖНО: НЕ включаем 'id' в fields - это предотвращает ошибку валидации
widgets = {
'quantity': forms.NumberInput(attrs={'min': 1, 'value': 1}),
# Скрываем поля product и product_kit - они будут заполняться через JS
@@ -254,6 +262,17 @@ class OrderItemForm(forms.ModelForm):
# Поле is_custom_price устанавливается через JS
self.fields['is_custom_price'].required = False
def clean_price(self):
"""Парсим цену с запятой или точкой"""
value = self.cleaned_data.get('price')
if value in (None, ''):
return None
value_str = str(value).strip().replace(',', '.')
try:
return Decimal(value_str)
except Exception:
raise forms.ValidationError('Введите число.')
def clean(self):
"""Валидация: должен быть выбран либо товар, либо комплект (не оба, не ни один)"""
cleaned_data = super().clean()