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
This commit is contained in:
admin i 2025-12-08 10:15:10 +03:00
parent 834f7cec9e
commit 7d15369df4
2 changed files with 17 additions and 2 deletions

View File

@ -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] <20> Проверяем 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:

View File

@ -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)