Добавлен backend для создания временных комплектов в заказах
Forms (orders/forms.py): - TemporaryKitForm: упрощенная форма для временного комплекта (название + описание) - TemporaryKitItemForm: форма для компонента временного комплекта - TemporaryKitItemFormSet: formset для управления компонентами Views (orders/views.py): - create_temporary_kit: AJAX endpoint для создания временного комплекта * Принимает JSON с названием, описанием и списком компонентов * Создает комплект с is_temporary=True * Связывает с заказом если указан order_id * Автоматически пересчитывает цену * Возвращает JSON с данными созданного комплекта URLs (orders/urls.py): - /orders/temporary-kits/create/ - endpoint для создания Теперь можно создавать временные комплекты через AJAX запрос. Следующий шаг - UI в форме заказа. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -154,3 +154,80 @@ OrderItemFormSet = inlineformset_factory(
|
||||
min_num=1, # Минимум 1 товар в заказе
|
||||
validate_min=True,
|
||||
)
|
||||
|
||||
|
||||
# === ВРЕМЕННЫЕ КОМПЛЕКТЫ ===
|
||||
|
||||
class TemporaryKitForm(forms.ModelForm):
|
||||
"""
|
||||
Упрощенная форма для создания временного комплекта.
|
||||
Используется при оформлении заказа для создания букета "на лету".
|
||||
"""
|
||||
|
||||
class Meta:
|
||||
model = ProductKit
|
||||
fields = ['name', 'description']
|
||||
widgets = {
|
||||
'description': forms.Textarea(attrs={'rows': 2, 'placeholder': 'Краткое описание (опционально)'}),
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
# Bootstrap классы
|
||||
for field in self.fields.values():
|
||||
if isinstance(field.widget, forms.Textarea):
|
||||
field.widget.attrs.update({'class': 'form-control'})
|
||||
else:
|
||||
field.widget.attrs.update({'class': 'form-control'})
|
||||
|
||||
# Название обязательно
|
||||
self.fields['name'].required = True
|
||||
self.fields['name'].widget.attrs.update({
|
||||
'placeholder': 'Название временного букета (например: "Букет для Анны")'
|
||||
})
|
||||
|
||||
# Описание опционально
|
||||
self.fields['description'].required = False
|
||||
|
||||
|
||||
class TemporaryKitItemForm(forms.Form):
|
||||
"""
|
||||
Форма для компонента временного комплекта.
|
||||
Используется в формсете для добавления товаров в букет.
|
||||
"""
|
||||
product = forms.IntegerField(required=False, widget=forms.HiddenInput())
|
||||
quantity = forms.DecimalField(
|
||||
required=False,
|
||||
min_value=0.001,
|
||||
max_digits=10,
|
||||
decimal_places=3,
|
||||
widget=forms.NumberInput(attrs={'class': 'form-control', 'min': '0.001', 'step': '1'})
|
||||
)
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
product_id = cleaned_data.get('product')
|
||||
quantity = cleaned_data.get('quantity')
|
||||
|
||||
# Пустая форма - это нормально (будет удалена)
|
||||
if not product_id:
|
||||
return cleaned_data
|
||||
|
||||
# Если выбран товар, количество обязательно
|
||||
if product_id and (not quantity or quantity <= 0):
|
||||
raise forms.ValidationError('Необходимо указать количество больше 0')
|
||||
|
||||
return cleaned_data
|
||||
|
||||
|
||||
# Formset для компонентов временного комплекта
|
||||
from django.forms import formset_factory
|
||||
|
||||
TemporaryKitItemFormSet = formset_factory(
|
||||
TemporaryKitItemForm,
|
||||
extra=1, # Одна пустая форма для добавления
|
||||
can_delete=True,
|
||||
min_num=1, # Минимум 1 компонент в комплекте
|
||||
validate_min=True,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user