From 7d15369df42be21b025aec7de4502c2a6d3e964d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Mon, 8 Dec 2025 10:15:10 +0300 Subject: [PATCH] fix: handle empty avatar field in profile update (complete fix) - Skip empty avatar field in views_front.py before sending to API - Add validate_avatar() in serializer to convert empty strings to None - Prevent avatar update when value is None in serializer.update() - Fix ValidationError when updating profile without changing avatar --- backend/api/v1/employees/views.py | 15 +++++++++++++-- backend/employees/views_front.py | 4 ++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/backend/api/v1/employees/views.py b/backend/api/v1/employees/views.py index df0e7927..6e5f61d0 100644 --- a/backend/api/v1/employees/views.py +++ b/backend/api/v1/employees/views.py @@ -1713,11 +1713,22 @@ class EmployeeViewSet(viewsets.ModelViewSet): else: logger.info(f"[ME PATCH] ✓ avatar НЕТ в request.FILES") + # КРИТИЧЕСКОЕ ИСПРАВЛЕНИЕ: удаляем пустое поле avatar ДО валидации + data_for_serializer = request.data + if 'avatar' in request.data: + avatar_value = request.data.get('avatar') + logger.info(f"[ME PATCH] � Проверяем avatar: type={type(avatar_value)}, value={repr(avatar_value)[:100]}") + + # Если avatar - пустая строка, создаем копию данных без него + if avatar_value == '': + logger.warning(f"[ME PATCH] 🔧 Удаляем пустое поле avatar из данных") + data_for_serializer = {k: v for k, v in request.data.items() if k != 'avatar'} + logger.info("[ME PATCH] Step 1: Validating serializer...") - logger.info(f"[ME PATCH] Step 1: Передаем в сериализатор data с ключами: {list(request.data.keys())}") + logger.info(f"[ME PATCH] Step 1: Передаем в сериализатор data с ключами: {list(data_for_serializer.keys())}") try: - ser = self.get_serializer(instance, data=request.data, partial=True) + ser = self.get_serializer(instance, data=data_for_serializer, partial=True) ser.is_valid(raise_exception=True) logger.info("[ME PATCH] Step 1: ✓ Serializer validated successfully") except ValidationError as ve: diff --git a/backend/employees/views_front.py b/backend/employees/views_front.py index 33673d75..949c3732 100644 --- a/backend/employees/views_front.py +++ b/backend/employees/views_front.py @@ -572,6 +572,10 @@ def employee_edit_me(request): for key, value in parsed_post.items(): if key == 'csrfmiddlewaretoken': continue + # Пропускаем пустое поле avatar (приходит из FormData без файла) + if key == 'avatar' and value == '': + logger.info("[employee_edit_me] Skipping empty avatar field") + continue # Если это массив (например skills_ids) if key.endswith('_ids') or key == 'skills': payload[key] = parsed_post.getlist(key)