From 5d2d0841c87cdc55d6c619a1d9db797d5d80a642 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 12:29:44 +0300 Subject: [PATCH] feat: add detailed logging for request creation errors Backend (API): - Added logging of user ID and request data keys before validation - Log validation errors with full details before raising exception - Helps diagnose 400 Bad Request errors from users Frontend (JS): - Added console logging of all FormData entries before submit - Improved error message display with field-specific validation errors - Shows structured error messages instead of generic 'HTTP 400' This will help identify why some users get 400 errors when creating requests. --- backend/api/v1/requests_app/views.py | 33 +++++++++++++++++-- .../js/components/requestCrudHandler.js | 23 ++++++++++++- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/backend/api/v1/requests_app/views.py b/backend/api/v1/requests_app/views.py index 1800e917..8d7c49ca 100644 --- a/backend/api/v1/requests_app/views.py +++ b/backend/api/v1/requests_app/views.py @@ -387,11 +387,38 @@ class RequestViewSet(viewsets.ModelViewSet): ) def create(self, request, *args, **kwargs): - """Создание заявки: валидируем write-сериализатором, отвечаем read-сериализатором.""" + """ + Создание заявки: валидируем write-сериализатором, + отвечаем read-сериализатором. + """ + import logging + logger = logging.getLogger(__name__) + + logger.info( + f"[RequestViewSet.create] User: {request.user.id}, " + f"Data keys: {list(request.data.keys())}" + ) + serializer = self.get_serializer(data=request.data) + if not serializer.is_valid(): + logger.error( + f"[RequestViewSet.create] Validation errors: " + f"{serializer.errors}" + ) + logger.error( + f"[RequestViewSet.create] Request data: {request.data}" + ) + serializer.is_valid(raise_exception=True) self.perform_create(serializer) instance = serializer.instance - read = RequestReadSerializer(instance, context=self.get_serializer_context()) + read = RequestReadSerializer( + instance, + context=self.get_serializer_context() + ) headers = self.get_success_headers(read.data) - return Response(read.data, status=status.HTTP_201_CREATED, headers=headers) + return Response( + read.data, + status=status.HTTP_201_CREATED, + headers=headers + ) diff --git a/backend/static/js/components/requestCrudHandler.js b/backend/static/js/components/requestCrudHandler.js index 3f007c96..d9776fa0 100644 --- a/backend/static/js/components/requestCrudHandler.js +++ b/backend/static/js/components/requestCrudHandler.js @@ -122,6 +122,13 @@ export function initRequestCrudHandler(options) { try { const url = saveAs === 'draft' ? `${apiListUrl}?save_as=draft` : apiListUrl; + + // Логируем данные для отладки + console.log('[requestCrudHandler] Creating request with data:'); + for (const [key, value] of formData.entries()) { + console.log(` ${key}:`, value); + } + const response = await fetch(url, { method: 'POST', headers: headers, @@ -130,7 +137,21 @@ export function initRequestCrudHandler(options) { if (!response.ok) { const error = await response.json(); - throw new Error(error.detail || 'HTTP ' + response.status); + console.error('[requestCrudHandler] Validation error:', error); + + // Показываем детали ошибки + let errorMessage = 'Не удалось создать заявление:\n'; + if (error.detail) { + errorMessage += error.detail; + } else if (typeof error === 'object') { + // Форматируем ошибки валидации + for (const [field, messages] of Object.entries(error)) { + const fieldMessages = Array.isArray(messages) ? messages.join(', ') : messages; + errorMessage += `\n${field}: ${fieldMessages}`; + } + } + + throw new Error(errorMessage); } await response.json();