JavaRush /Курсы /Модуль 3: Django /Использование сообщений с редиректами в Django

Использование сообщений с редиректами в Django

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

Теперь мы углубимся в использование сообщений в более реальном сценарии — при редиректах. Если вы хотите уведомить пользователя об успешном (или неуспешном) действии после выполнения важного процесса (например, после отправки формы или выполнения какой-то операции), вам придется использовать сообщения с редиректами. Это не только сделает ваш код более элегантным, но и сильно поможет в улучшении UX (опыта пользователя).

Что такое редирект и зачем нужны сообщения при нем?

Представьте, что пользователь заполняет форму на вашем сайте. После её отправки отправляем его на другую страницу. Но откуда ему знать, что форма была успешно сохранена или что произошла ошибка? Томительное молчание веб-приложения вызывает тревогу. Мы же не хотим, чтобы пользователь чувствовал себя одиноким в этом мире кода.

Решение? Сообщения с редиректами! Они позволяют "пронести" уведомление с одной страницы на другую. Это можно сделать в сессии пользователя: сообщение временно сохраняется, пока страница пользователя не будет обновлена или пока он не покинет текущую сессию.

Как это работает? Всё просто: Django автоматически сохраняет сообщения в "мешке сообщений" (message storage) в сессии. После перехода на другую страницу и отображения сообщения оно удаляется. Это называется временными сообщениями.

Практика: использование сообщений с редиректами

Начнем с классического сценария: пользователь отправляет форму для создания нового объекта. После успешного сохранения мы перенаправим его на страницу списка объектов и покажем уведомление.

функциональное представление (FBV):

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import MyModelForm
from .models import MyModel

def create_object(request):
    if request.method == "POST":
        form = MyModelForm(request.POST)
        if form.is_valid():
            form.save()  # Сохраняем объект
            # Добавляем сообщение об успехе
            messages.success(request, "Объект успешно создан!")
            # Редирект пользователя на страницу со списком объектов
            return redirect("object_list")
        else:
            # Если форма не валидна, добавляем ошибку
            messages.error(request, "Ошибка создания объекта. Проверьте данные.")
    else:
        form = MyModelForm()

    return render(request, "create_object.html", {"form": form})

Что здесь происходит?

  1. Если форма валидна, мы создаем объект и тут же отправляем сообщение success с помощью метода messages.success.
  2. Затем с помощью redirect перенаправляем пользователя на другую страницу (в данном случае на object_list).
  3. Если форма не проходит валидацию, мы добавляем сообщение error и снова рендерим ту же страницу с формой.

В результате пользователь увидит уведомление на целевой странице. Удобно, правда?

Классовое представление (CBV)

Давайте перепишем пример на основе классовых представлений. Для этого воспользуемся встроенным классом CreateView из Django.

from django.views.generic.edit import CreateView
from django.contrib import messages
from django.urls import reverse_lazy
from .models import MyModel
from .forms import MyModelForm

class MyModelCreateView(CreateView):
    model = MyModel
    form_class = MyModelForm
    template_name = "create_object.html"
    success_url = reverse_lazy("object_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 мы добавляем сообщение success при успешном сохранении формы.
  • В методе form_invalid добавляем сообщение error при ошибке.
  • URL для редиректа указывается через свойство success_url.

Добавление сообщений в шаблонах

На одной из предыдущих лекций мы уже научились отображать сообщения в шаблонах. Но чтобы освежить память, повторим это здесь.

Шаблон base.html

В типичном проекте вы, скорее всего, будете отображать все сообщения в одном месте, например, в базовом шаблоне.

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li class="alert {{ message.tags }}">
                {{ message }}
            </li>
        {% endfor %}
    </ul>
{% endif %}
  1. Переменная messages автоматически доступна в каждом шаблоне, если вы настроили MessageMiddleware (оно включено по умолчанию).
  2. Свойство message.tags помогает добавлять CSS-классы в зависимости от типа сообщения (success, error, и т.д.).
  3. Убедитесь, что вы добавили соответствующие стили CSS.

Стилизация CSS

Вот пример CSS для стилизации уведомлений. Он поможет отделить важные сообщения от менее значимых.

.alert {
    padding: 10px;
    margin: 5px 0;
    border-radius: 4px;
    font-weight: bold;
}

.alert.success {
    background-color: #d4edda;
    color: #155724;
    border: 1px solid #c3e6cb;
}

.alert.error {
    background-color: #f8d7da;
    color: #721c24;
    border: 1px solid #f5c6cb;
}

.alert.warning {
    background-color: #fff3cd;
    color: #856404;
    border: 1px solid #ffeeba;
}

.alert.info {
    background-color: #d1ecf1;
    color: #0c5460;
    border: 1px solid #bee5eb;
}

Теперь ваши сообщения будут выглядеть профессионально и аккуратно.

Важные моменты и типичные ошибки

Когда вы используете редиректы с сообщениями, важно следить за следующим:

  1. Не забывайте редиректить после добавления сообщения. Если этого не сделать, сообщение может появиться дважды, так как оно не удаляется после первого показа.

  2. Убедитесь, что django.contrib.messages включен в настройках. По умолчанию он подключен, но иногда его случайно удаляют.

  3. Старайтесь не злоупотреблять сообщениями. Если на одной странице отображается более 3-4 сообщений, это может сбить пользователя с толку. Оставляйте только самое важное.

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

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

  1. Создайте представление для создания нового объекта (функциональное или классовое).
  2. Добавьте уведомление об успешном создании объекта.
  3. Реализуйте сообщение об ошибке, если данные, введенные пользователем, оказываются невалидными.
  4. Стилизуйте уведомления с помощью CSS.

Проверьте, работает ли ваша система уведомлений так, как ожидалось.

Вы сделали это! Теперь ваше приложение общается с пользователями как истинный джентльмен: оно даёт понять, когда что-то пошло не так, и хвалит, если всё хорошо.

1
Задача
Модуль 3: Django, 14 уровень, 7 лекция
Недоступна
Редирект с сообщением об ошибке
Редирект с сообщением об ошибке
1
Задача
Модуль 3: Django, 14 уровень, 7 лекция
Недоступна
Использование сообщений с обработкой форм
Использование сообщений с обработкой форм
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ