feat: Улучшена система сообщений об ошибках и предупреждениях

Изменения:
- ProductCreateView/UpdateView теперь показывают warnings для предупреждений о лимите фото
- Разделение сообщений: error (красный) vs warning (желтый)
- Улучшен components/messages.html:
  * Добавлены иконки для каждого типа сообщения
  * Bootstrap Icons интеграция
  * Кастомные цвета для alerts
  * Лучший visual feedback для пользователя

Теперь пользователи видят понятные сообщения везде на сайте!

🤖 Generated with Claude Code
This commit is contained in:
2025-11-15 11:27:08 +03:00
parent f7d1851418
commit d9903cd721
2 changed files with 65 additions and 4 deletions

View File

@@ -119,7 +119,11 @@ class ProductCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView)
photo_errors = handle_photos(self.request, self.object, ProductPhoto, 'product') photo_errors = handle_photos(self.request, self.object, ProductPhoto, 'product')
if photo_errors: if photo_errors:
for error in photo_errors: for error in photo_errors:
messages.error(self.request, error) # Если это предупреждение о лимите фото - warning, иначе - error
if 'Загружено' in error and 'обработано только' in error:
messages.warning(self.request, error)
else:
messages.error(self.request, error)
messages.success(self.request, f'Товар "{form.instance.name}" успешно создан!') messages.success(self.request, f'Товар "{form.instance.name}" успешно создан!')
return response return response
@@ -166,7 +170,11 @@ class ProductUpdateView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView)
photo_errors = handle_photos(self.request, self.object, ProductPhoto, 'product') photo_errors = handle_photos(self.request, self.object, ProductPhoto, 'product')
if photo_errors: if photo_errors:
for error in photo_errors: for error in photo_errors:
messages.error(self.request, error) # Если это предупреждение о лимите фото - warning, иначе - error
if 'Загружено' in error and 'обработано только' in error:
messages.warning(self.request, error)
else:
messages.error(self.request, error)
messages.success(self.request, f'Товар "{form.instance.name}" успешно обновлен!') messages.success(self.request, f'Товар "{form.instance.name}" успешно обновлен!')
return response return response

View File

@@ -3,10 +3,63 @@
{% if messages %} {% if messages %}
<div class="container mt-3"> <div class="container mt-3">
{% for message in messages %} {% for message in messages %}
<div class="alert alert-{{ message.tags }} alert-dismissible fade show" role="alert"> <div class="alert alert-{{ message.tags }} alert-dismissible fade show d-flex align-items-start" role="alert">
{{ message }} <!-- Иконка в зависимости от типа сообщения -->
<div class="me-2" style="font-size: 1.3rem; margin-top: 2px;">
{% if message.tags == 'success' %}
<i class="bi bi-check-circle-fill"></i>
{% elif message.tags == 'error' %}
<i class="bi bi-exclamation-triangle-fill"></i>
{% elif message.tags == 'warning' %}
<i class="bi bi-exclamation-circle-fill"></i>
{% else %}
<i class="bi bi-info-circle-fill"></i>
{% endif %}
</div>
<div class="flex-grow-1">
{{ message }}
</div>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<style>
/* Кастомные цвета для alerts */
.alert-success {
background-color: #d4edda;
border-color: #c3e6cb;
color: #155724;
}
.alert-success .bi {
color: #28a745;
}
.alert-error {
background-color: #f8d7da;
border-color: #f5c6cb;
color: #721c24;
}
.alert-error .bi {
color: #dc3545;
}
.alert-warning {
background-color: #fff3cd;
border-color: #ffeaa7;
color: #856404;
}
.alert-warning .bi {
color: #ffc107;
}
.alert-info {
background-color: #d1ecf1;
border-color: #bee5eb;
color: #0c5460;
}
.alert-info .bi {
color: #17a2b8;
}
</style>
{% endif %} {% endif %}