JavaRush /Курсы /Модуль 3: Django /Использование функции messages.add_message()

Использование функции messages.add_message()

Модуль 3: Django
14 уровень , 3 лекция
Открыта

Мы уже успели разобрать основные типы сообщений, такие как success, error, warning и info, и обсудили, когда и как их использовать. Теперь пришло время углубиться в самый мощный инструмент работы с сообщениями — messages.add_message(). Готовы? Пристегните ремни!

Что такое messages.add_message()

Вначале разберёмся, что такое messages.add_message() и зачем он нам нужен.
На практике часто возникает потребность уведомить пользователя о выполнении какого-то действия: успешной отправке формы, ошибке при входе в систему или предупреждении о заполнении обязательных полей. Message Framework предоставляет удобный способ добавления таких уведомлений в представления — через метод messages.add_message().

В Django Message Framework есть несколько сокращённых функций для добавления уведомлений: messages.success(), messages.error() и так далее. Однако add_message() предоставляет наибольшую гибкость:

  1. Позволяет задавать любой кастомный уровень сообщения.
  2. Универсальный — подходит для всех типов сообщений.
  3. Подходит для динамического добавления сообщений.

Синтаксис функции messages.add_message()

Давайте посмотрим, как выглядит её базовый синтаксис:

from django.contrib import messages

messages.add_message(request, level, message, extra_tags='', fail_silently=False)

Разберём аргументы:

  • request: объект запроса, в котором будут сохраняться сообщения.
  • level: уровень сообщения. Например, messages.SUCCESS, messages.ERROR и так далее.
  • message: текст самого сообщения.
  • extra_tags (необязательно): дополнительные теги для кастомизации отображения (например, CSS-классы).
  • fail_silently (необязательно): если True, то игнорирует ошибки при добавлении сообщения.

Пример использования

Начнём с простого примера. Добавим сообщение об успешной регистрации пользователя.

from django.contrib import messages
from django.shortcuts import redirect

def register_user(request):
    # Логика регистрации пользователя (условно)
    if request.method == 'POST':
        # Выполняем регистрацию...
        messages.add_message(request, messages.SUCCESS, 'Вы успешно зарегистрировались!')
        return redirect('home')  # Перенаправляем на главную страницу

В этом примере:

  1. Мы добавляем сообщение с уровнем SUCCESS.
  2. После добавления сообщения пользователь перенаправляется на home, где его ждёт наше уведомление.

Теперь, чтобы увидеть это сообщение, нужно рендерить их в шаблоне (об этом мы говорили в лекции 136). Если вы забыли, напомню, как это делается:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li class="{{ message.tags }}">{{ message }}</li>
        {% endfor %}
    </ul>
{% endif %}

4. Динамическое добавление уровней

С помощью messages.add_message() мы можем программно выбирать уровень сообщения. Например, в зависимости от результата действия (успех или ошибка):

Пример: динамическое определение уровня сообщения

from django.contrib import messages
from django.shortcuts import redirect

def process_form(request):
    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            # Успешно обработали форму
            messages.add_message(request, messages.SUCCESS, 'Форма успешно отправлена!')
        else:
            # Ошибка при обработке формы
            messages.add_message(request, messages.ERROR, 'Возникли ошибки при заполнении формы.')
        return redirect('form_page')

Это может быть полезно, если вы хотите логически обработать сообщения по разным сценариям, вместо использования фиксированных функций, таких как messages.success() или messages.error().

Кастомизация с помощью extra_tags

Хотите придать сообщениям уникальный стиль? Используйте параметр extra_tags. Он добавляет дополнительные CSS-классы к вашему сообщению.

Пример: добавление кастомных тегов

from django.contrib import messages
from django.shortcuts import redirect

def login_user(request):
    if request.method == 'POST':
        # Простейшая логика авторизации
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'admin' and password == 'password123':
            messages.add_message(request, messages.SUCCESS, 'Добро пожаловать, администратор!', extra_tags='admin-message')
            return redirect('dashboard')
        else:
            messages.add_message(request, messages.ERROR, 'Неверные учётные данные.', extra_tags='login-error')
            return redirect('login')

И в шаблоне:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li class="{{ message.tags }}">{{ message }}</li>
        {% endfor %}
    </ul>
{% endif %}

Теперь уведомление об успешном входе получит дополнительные стили через CSS-класс admin-message, а сообщение об ошибке — через CSS-класс login-error. Это можно использовать для стилизации или даже для JavaScript-анимаций.

Особенности fail_silently

Иногда сообщения не добавляются в результате ошибок (например, если MessageMiddleware не подключён). Аргумент fail_silently=True игнорирует эти ошибки. Однако его использование может привести к "пропаже" сообщений, если проект настроен некорректно.

Рекомендация: старайтесь использовать fail_silently=False (по умолчанию), чтобы быть уверенными в том, что всё настроено правильно.

Практическое задание

Часть 1. Реализация уведомлений в форме обратной связи

Создайте страницу обратной связи. Если форма отправлена корректно, показывайте пользователю уведомление с уровнем SUCCESS. Если форма заполнена неверно, уведомляйте с уровнем ERROR. Убедитесь, что уведомления работают с редиректом.

Подсказка: форма должна быть связана с views.py так:

from django.contrib import messages
from django.shortcuts import redirect, render
from .forms import ContactForm

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # Сохранение данных формы
            messages.add_message(request, messages.SUCCESS, 'Ваше сообщение отправлено!')
            return redirect('contact')
        else:
            messages.add_message(request, messages.ERROR, 'Ошибка! Проверьте правильность заполнения.')
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

Часть 2. Кастомные стили для сообщений

Добавьте в уведомления extra_tags для стилизации. Например, успешное сообщение пусть будет зелёным, а сообщение об ошибке — красным.

Пример CSS:

.success {
    color: green;
    font-weight: bold;
}

.error {
    color: red;
    font-weight: bold;
}

Шаблон:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li class="{{ message.tags }}">{{ message }}</li>
        {% endfor %}
    </ul>
{% endif %}

Теперь вы знаете, как управлять уведомлениями в Django с помощью messages.add_message(). Этот инструмент не только удобен, но и крайне важен для создания дружелюбного интерфейса в любом веб-приложении.

1
Задача
Модуль 3: Django, 14 уровень, 3 лекция
Недоступна
Отображение сообщений в шаблоне
Отображение сообщений в шаблоне
1
Задача
Модуль 3: Django, 14 уровень, 3 лекция
Недоступна
Классификация с дополнительными тегами
Классификация с дополнительными тегами
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Максим Уровень 71
26 ноября 2025
messages.add_message() — низкоуровневый метод. messages.success() — удобный сахар. messages.add_message(request, 999, "Экзотический уровень сообщения!") В теме на различия внимания не обратили...