From 49cfec30884d7e99ab8c97535277e0fc9564b34e Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Fri, 12 Dec 2025 00:08:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20ValidationError=20=D1=81=20=D0=B2=D1=8B=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=D0=BE=D0=BC=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Django=20?= =?UTF-8?q?messages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: ValidationError из сигналов отображался как: 'Server error: [\'Заказ 134 был отменён...\']' со служебными элементами (Server error, квадратные скобки). Решение: В order_update добавлена обработка ValidationError перед ValueError: - Извлекаем чистое сообщение из исключения (e.messages[0] или str(e)) - Показываем через messages.error() — Django автоматически отобразит красивым Bootstrap alert-danger - Транзакция откатывается, изменения не сохраняются Теперь пользователь видит: [красный Bootstrap alert] 'Заказ 134 был отменён, товары проданы в другом заказе. Невозможно изменить статус. Для новой продажи создайте новый заказ.' Без технических префиксов и форматирования - user-friendly. --- myproject/orders/views.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/myproject/orders/views.py b/myproject/orders/views.py index 26e57b1..6c19e1d 100644 --- a/myproject/orders/views.py +++ b/myproject/orders/views.py @@ -246,6 +246,15 @@ def order_update(request, order_number): messages.success(request, f'Заказ #{order.order_number} успешно обновлен!') return redirect('orders:order-detail', order_number=order.order_number) + except ValidationError as e: + # Ошибка валидации (например, запрет смены статуса для возвращённого заказа) + # Транзакция откатилась, заказ НЕ изменился + # Показываем сообщение из исключения без служебных элементов + error_message = str(e.message) if hasattr(e, 'message') else str(e) + # Если это список ошибок, берём первую + if hasattr(e, 'messages'): + error_message = e.messages[0] if e.messages else str(e) + messages.error(request, error_message) except ValueError as e: # Ошибка в сигналах (например, не удалось создать Sale) # Транзакция откатилась, статус НЕ изменился