# -*- coding: utf-8 -*- from django import forms from django.core.exceptions import ValidationError from .models import Showcase, Warehouse class ShowcaseForm(forms.ModelForm): """ Форма для создания и редактирования витрин. Витрина привязывается к складу и используется для выкладки готовых букетов. """ class Meta: model = Showcase fields = ['name', 'warehouse', 'description', 'is_active'] widgets = { 'name': forms.TextInput(attrs={ 'class': 'form-control', 'placeholder': 'Название витрины (например: Витрина №1, Витрина у входа)' }), 'warehouse': forms.Select(attrs={'class': 'form-control'}), 'description': forms.Textarea(attrs={ 'class': 'form-control', 'rows': 3, 'placeholder': 'Описание витрины, её расположение или особенности' }), 'is_active': forms.CheckboxInput(attrs={'class': 'form-check-input'}), } labels = { 'name': 'Название витрины', 'warehouse': 'Склад', 'description': 'Описание', 'is_active': 'Активна', } help_texts = { 'warehouse': 'Склад, к которому привязана витрина', 'is_active': 'Неактивные витрины скрыты из списка выбора', } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Фильтруем только активные склады self.fields['warehouse'].queryset = Warehouse.objects.filter(is_active=True).order_by('name') # Если создаём новую витрину и есть склад по умолчанию - предвыбираем его if not self.instance.pk and not self.initial.get('warehouse'): default_warehouse = Warehouse.objects.filter( is_active=True, is_default=True ).first() if default_warehouse: self.initial['warehouse'] = default_warehouse.id def clean_name(self): """Проверка уникальности названия витрины в рамках склада""" name = self.cleaned_data.get('name') warehouse = self.cleaned_data.get('warehouse') if name and warehouse: # Проверяем уникальность названия в рамках склада queryset = Showcase.objects.filter(name=name, warehouse=warehouse) # При редактировании исключаем текущий экземпляр if self.instance and self.instance.pk: queryset = queryset.exclude(pk=self.instance.pk) if queryset.exists(): raise ValidationError( f'Витрина с названием "{name}" уже существует на складе "{warehouse.name}". ' 'Пожалуйста, выберите другое название.' ) return name