Сьогодні будемо практикуватися у використанні Django Message Framework у представленнях (views). На цьому етапі ви вже знаєте, що таке Message Framework і як його налаштувати. Тепер настав час додати сповіщення у функціональні елементи нашого веб-застосунку та зробити їх корисними для користувача.
🚀 Як повідомити користувача про результат його дій?
Ми вже відповідали на це питання раніше, і у випадку з Django відповідь проста: використовуємо Message Framework.
Django Message Framework — це чарівна паличка для відображення сповіщень про результати дій користувача. Ми додаємо повідомлення у представлення, щоб інформувати користувачів про отриманий результат:
- Форму успішно збережено.
- Вказано некоректні дані.
- Об'єкт видалено.
- У вас недостатньо прав для виконання дії.
🧑💻 Як додавати повідомлення у функціональні представлення (FBV)?
Функціональні представлення (Function-Based Views) — це найпростіший спосіб роботи з Django представленнями. Давайте розберемо базовий приклад:
📌 Додавання повідомлення при успішному завантаженні даних
Код говорить сам за себе:
from django.shortcuts import render, redirect
from django.contrib import messages
def create_post(request):
if request.method == "POST":
title = request.POST.get("title")
if title: # Перевіряємо, чи є заголовок
# Логіка збереження даних
messages.success(request, "Пост успішно створено!") # Успішне повідомлення
return redirect("post_list") # Редирект на список постів
else:
messages.error(request, "Помилка: Заголовок обов'язковий!") # Помилка
return render(request, "create_post.html")
Ось що тут відбувається:
- Ми перевіряємо
POST-запит, щоб дізнатися, чи надіслав користувач форму. - Якщо все успішно, додаємо повідомлення з типом
successі редиректимо користувача. - Якщо щось пішло не так, виводимо повідомлення про помилку з типом
error.
змініть повідомлення залежно від логіки! Наприклад, додайте типи warning або info.
🛠 Додавання повідомлень у класові представлення (CBV)
Класові представлення (Class-Based Views) надають більше гнучкості. Ось приклад:
from django.views.generic.edit import CreateView
from django.contrib import messages
from django.urls import reverse_lazy
from .models import Post
class PostCreateView(CreateView):
model = Post
fields = ['title', 'content']
template_name = 'post_form.html'
success_url = reverse_lazy('post_list')
def form_valid(self, form):
# Якщо форма валідна, додаємо повідомлення про успіх
messages.success(self.request, "Пост успішно створено!")
return super().form_valid(form)
def form_invalid(self, form):
# Якщо форма не валідна, додаємо повідомлення про помилку
messages.error(self.request, "Помилка: Перевірте форму.")
return super().form_invalid(form)
form_valid()— викликається при успішній відправці форми.form_invalid()— викликається при помилці заповнення форми.- Використовуємо
messages.successдля успіху таmessages.errorдля помилок.
CBV зручно кастомізувати, додаючи свої методи. Це економить час на написання коду.
🤹 Приклад використання в CRUD-операціях
Тепер побудуємо повноцінний робочий CRUD-приклад із повідомленнями. Використовуємо FBV:
from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from .models import Post
def post_list(request):
posts = Post.objects.all()
return render(request, "post_list.html", {"posts": posts})
def post_create(request):
if request.method == "POST":
title = request.POST.get("title")
if title:
Post.objects.create(title=title)
messages.success(request, "Пост додано.")
else:
messages.error(request, "Помилка: Заголовок обов'язковий.")
return redirect("post_list")
return render(request, "post_create.html")
def post_update(request, pk):
post = get_object_or_404(Post, pk=pk)
if request.method == "POST":
title = request.POST.get("title")
if title:
post.title = title
post.save()
messages.success(request, "Пост оновлено.")
else:
messages.warning(request, "Заголовок не може бути порожнім.")
return redirect("post_list")
return render(request, "post_update.html", {"post": post})
def post_delete(request, pk):
post = get_object_or_404(Post, pk=pk)
post.delete()
messages.info(request, f"Пост '{post.title}' видалено.")
return redirect("post_list")
🖼 Схема повідомлень: типи та приклади
| Дія | Тип повідомлення | Приклад тексту |
|---|---|---|
| Створення поста | success |
"Пост успішно створено." |
| Порожнє поле вводу | error |
"Помилка: Поле вводу не може бути порожнім." |
| Оновлення даних | success |
"Пост успішно оновлено." |
| Видалення поста | info |
"Пост було видалено." |
| Увага | warning |
"Заголовок не повинен бути порожнім." |
🎨 Відображення повідомлень у шаблонах
Давай додамо HTML-код для відображення повідомлень. Встав наступний блок коду у базовий шаблон base.html:
{% if messages %}
<div>
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">
{{ message }}
</div>
{% endfor %}
</div>
{% endif %}
Стильова магія ✨
Ми використовуємо клас alert у цьому прикладі (наприклад, від Bootstrap). Рівень повідомлення автоматично підставить CSS-клас, наприклад:
success→alert-successerror→alert-dangerwarning→alert-warninginfo→alert-info
💡 Типові помилки при використанні повідомлень
Коли починаємо працювати з Message Framework, можуть виникнути деякі нюанси:
Повідомлення не відображаються. Перевірте, чи підключений
context_processors.messagesу налаштуванняхTEMPLATES.Повідомлення не очищуються. Це звичайна поведінка фреймворку. Повідомлення видалиться автоматично після першого відображення, якщо все налаштовано коректно.
Багато однотипних повідомлень. Ви можете випадково додати одне й те саме повідомлення кілька разів. Контролюйте додавання повідомлень у коді.
📝 Практичне завдання
- Реалізуйте логіку повідомлень
successіerrorу своєму проєкті. - Додайте повідомлення для всіх CRUD-дій (створення, оновлення, видалення).
- Кастомізуйте зовнішній вигляд повідомлень за допомогою CSS.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ