Функция get_messages

Функция get_messages применяется к объекту запроса и возвращает итератор по всем сообщениям, хранящимся в текущей сессии или в хранилище сообщений запроса. Сообщения представлены объектами класса Message, которые содержат уровень важности, само сообщение и дополнительные теги для оформления. Функция принимает один обязательный аргумент - объект запроса, и возвращает коллекцию сообщений, которые были добавлены ранее в процессе обработки запроса.

Синтаксис

pythonfrom django.contrib.messages import get_messages

messages = get_messages(request)

Пример . Использование в представлении

Давайте получим все сообщения из хранилища запроса в представлении:

pythonfrom django.contrib import messages
from django.contrib.messages import get_messages
from django.shortcuts import render, redirect

def my_view(request):
  # Добавляем несколько сообщений разных уровней
  messages.success(request, "Операция выполнена успешно")
  messages.warning(request, "Возможны проблемы с производительностью")
  messages.error(request, "Произошла ошибка валидации")

  # Получаем все сообщения из хранилища
  all_messages = get_messages(request)

  # Выводим информацию о каждом сообщении
  for message in all_messages:
    print(f"Уровень: {message.level}")
    print(f"Сообщение: {message.message}")
    print(f"Теги: {message.tags}")
    print("---")

  return render(request, "my_template.html")

Результат выполнения кода:

python"Уровень: 25"
"Сообщение: Операция выполнена успешно"
"Теги: success"
"---"
"Уровень: 30"
"Сообщение: Возможны проблемы с производительностью"
"Теги: warning"
"---"
"Уровень: 40"
"Сообщение: Произошла ошибка валидации"
"Теги: error"
"---"

Пример . Использование в шаблоне

Чаще всего функция get_messages используется в представлениях для передачи сообщений в шаблон. Рассмотрим пример с передачей сообщений в контекст:

pythonfrom django.contrib import messages
from django.contrib.messages import get_messages
from django.shortcuts import render

def article_list(request):
  # Добавляем информационное сообщение
  messages.info(request, "Показаны все доступные статьи")

  # Получаем все сообщения для передачи в шаблон
  messages_list = get_messages(request)

  context = {
    "messages_list": messages_list,
  }
  return render(request, "articles/list.html", context)

Пример . Обработка сообщений из сессии

Функция get_messages также позволяет получить сообщения, которые были сохранены в сессии после редиректа:

pythonfrom django.contrib import messages
from django.contrib.messages import get_messages
from django.shortcuts import redirect, render

def create_article(request):
  if request.method == "POST":
    # Добавляем сообщение перед редиректом
    messages.success(request, "Статья успешно создана")
    return redirect("articles:list")

def articles_list(request):
  # Получаем сообщения после редиректа
  messages_list = get_messages(request)

  # Проверяем наличие сообщений
  if messages_list:
    first_message = messages_list[0]
    print(f"Уровень: {first_message.level}")
    print(f"Сообщение: {first_message.message}")

  return render(request, "articles/list.html")

Результат выполнения кода:

python"Уровень: 25"
"Сообщение: Статья успешно создана"

Пример . Работа с уровнями сообщений

Функция get_messages возвращает сообщения с различными уровнями важности. Можно фильтровать сообщения по их уровню:

pythonfrom django.contrib import messages
from django.contrib.messages import get_messages, constants
from django.shortcuts import render

def messages_demo(request):
  # Добавляем сообщения разных уровней
  messages.debug(request, "Отладочное сообщение")
  messages.info(request, "Информационное сообщение")
  messages.success(request, "Успешная операция")
  messages.warning(request, "Предупреждение")
  messages.error(request, "Критическая ошибка")

  # Получаем все сообщения
  all_messages = get_messages(request)

  # Отделяем информационные сообщения от сообщений с ошибками
  info_messages = []
  error_messages = []

  for msg in all_messages:
    if msg.level >= constants.ERROR:
      error_messages.append(msg.message)
    elif msg.level >= constants.INFO:
      info_messages.append(msg.message)

  print(f"Информационные сообщения: {info_messages}")
  print(f"Сообщения об ошибках: {error_messages}")

  return render(request, "demo.html")

Результат выполнения кода:

python"Информационные сообщения: ['Отладочное сообщение', 'Информационное сообщение', 'Успешная операция', 'Предупреждение']"
"Сообщения об ошибках: ['Критическая ошибка']"

Пример . Использование с пользовательской обработкой

Функция get_messages полезна для создания пользовательской логики отображения сообщений, например, для группировки по уровням:

pythonfrom django.contrib import messages
from django.contrib.messages import get_messages
from django.shortcuts import render

def articles_dashboard(request):
  # Добавляем несколько сообщений
  messages.info(request, "Загружено 5 статей")
  messages.success(request, "Последняя статья обновлена")
  messages.warning(request, "В очереди на обработку 3 статьи")

  # Получаем все сообщения для анализа
  messages_list = get_messages(request)

  # Создаем структурированный словарь сообщений по уровням
  messages_by_level = {}
  for message in messages_list:
    level_name = message.level
    if level_name not in messages_by_level:
      messages_by_level[level_name] = []
    messages_by_level[level_name].append(message.message)

  # Выводим статистику по сообщениям
  for level, msgs in messages_by_level.items():
    print(f"Уровень {level}: {len(msgs)} сообщений")

  context = {
    "messages_by_level": messages_by_level,
  }
  return render(request, "dashboard.html", context)

Результат выполнения кода:

python"Уровень 20: 1 сообщений"
"Уровень 25: 1 сообщений"
"Уровень 30: 1 сообщений"

Смотрите также

  • функция add_message,
    которая добавляет сообщение в хранилище запроса
  • функция success,
    которая добавляет сообщение об успешной операции
  • функция error,
    которая добавляет сообщение об ошибке
  • функция warning,
    которая добавляет предупреждающее сообщение