from django import forms from django.core.exceptions import ValidationError from phonenumber_field.formfields import PhoneNumberField from phonenumber_field.widgets import PhoneNumberPrefixWidget from .models import Customer class CustomerForm(forms.ModelForm): phone = PhoneNumberField( region='BY', required=False, help_text='Формат: +375XXXXXXXXX или 80XXXXXXXXX', widget=forms.TextInput(attrs={'placeholder': '+375XXXXXXXXX'}) ) class Meta: model = Customer fields = ['name', 'email', 'phone', 'notes'] exclude = ['is_system_customer'] widgets = { 'notes': forms.Textarea(attrs={'rows': 3}), } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # Ensure phone displays in E.164 format if self.instance and self.instance.phone: self.initial['phone'] = str(self.instance.phone) for field_name, field in self.fields.items(): if field_name == 'notes': # Textarea already has rows=3 from widget, just add class field.widget.attrs.update({'class': 'form-control'}) else: # Regular input fields get form-control class field.widget.attrs.update({'class': 'form-control'}) def clean_email(self): """Проверяет уникальность email при создании/редактировании""" email = self.cleaned_data.get('email') # Нормализуем пустые значения в None (Django best practice для nullable полей) if not email: return None # Проверяем уникальность queryset = Customer.objects.filter(email=email) # При редактировании исключаем текущий экземпляр if self.instance and self.instance.pk: queryset = queryset.exclude(pk=self.instance.pk) if queryset.exists(): raise ValidationError('Клиент с таким email уже существует.') return email def clean_phone(self): """Проверяет уникальность телефона при создании/редактировании""" phone = self.cleaned_data.get('phone') # Нормализуем пустые значения в None (Django best practice для nullable полей) if not phone: return None # Проверяем уникальность queryset = Customer.objects.filter(phone=phone) # При редактировании исключаем текущий экземпляр if self.instance and self.instance.pk: queryset = queryset.exclude(pk=self.instance.pk) if queryset.exists(): raise ValidationError('Клиент с таким номером телефона уже существует.') return phone def clean(self): """Дополнительная валидация формы""" cleaned_data = super().clean() # Защита от редактирования системного клиента if self.instance and self.instance.pk and self.instance.is_system_customer: raise ValidationError( 'Системный клиент не может быть изменен. ' 'Он необходим для корректной работы системы и создается автоматически.' ) return cleaned_data