Добавлена функциональность редактирования заказов с обновлением резервов товаров
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user