feat: Улучшена система сообщений об ошибках и предупреждениях
Изменения:
- ProductCreateView/UpdateView теперь показывают warnings для предупреждений о лимите фото
- Разделение сообщений: error (красный) vs warning (желтый)
- Улучшен components/messages.html:
* Добавлены иконки для каждого типа сообщения
* Bootstrap Icons интеграция
* Кастомные цвета для alerts
* Лучший visual feedback для пользователя
Теперь пользователи видят понятные сообщения везде на сайте!
🤖 Generated with Claude Code
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
Reference in New Issue
Block a user