Menu
CoddyTech

Сообщения об успешном выполнении

Часть раздела Формы путешествия по Django на Coddy. Урок 15 из 20.

После сохранения посетитель попадает на страницу мероприятия, но ничто не подтверждает, что сохранение прошло успешно. Представление не может передать переменную на эту страницу: её формирует другое представление в следующем запросе.

Фреймворк сообщений Django переносит уведомление через перенаправление. Представление добавляет его перед перенаправлением; Django сохраняет его для этого посетителя и передаёт следующей отображаемой странице. Например, блог сохраняет комментарий:

from django.contrib import messages

comment.save()
messages.success(request, "Thanks, your comment is posted.")
return redirect("blog:post", pk=post.pk)

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

{% for message in messages %}
<p class="note">{{ message }}</p>
{% endfor %}

Перебор messages помечает сообщения как прочитанные, поэтому каждое из них показывается один раз.

challenge icon

Задание

Легко

Сообщите посетителю об успешном сохранении.

  1. В events/views.py добавьте сообщение об успехе после каждого сохранения, перед перенаправлением: в new_event — Your event was added., в edit_event — Your changes were saved., в delete_event — The event was deleted.
  2. В base.html, перед {% block content %}, показывайте каждое сообщение как элемент <li> внутри <ul class="messages">, а сам список выводите только при наличии сообщений.

Добавьте событие: вверху отображается сообщение Your event was added., а после перезагрузки страницы оно исчезает.

Попробуйте сами

from django.shortcuts import get_object_or_404, redirect, render

from .forms import EventForm
from .models import Event


def event_list(request):
    q = request.GET.get("q", "")
    events = Event.objects.all()
    if q:
        events = events.filter(title__icontains=q)
    return render(request, "events/event_list.html", {"events": events, "q": q})


def event_detail(request, pk):
    event = get_object_or_404(Event, pk=pk)
    return render(request, "events/event_detail.html", {"event": event})


def new_event(request):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        form = EventForm(request.POST, instance=event)
        if form.is_valid():
            form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm(instance=event)
    return render(request, "events/edit_event.html", {"form": form, "event": event})


def delete_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    if request.method == "POST":
        event.delete()
        return redirect("events:list")
    return render(request, "events/delete_event.html", {"event": event})
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Формы

Потренируйтесь самостоятельно: Песочница Django