Сообщения об успешном выполнении
Часть раздела Формы путешествия по 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 помечает сообщения как прочитанные, поэтому каждое из них показывается один раз.
Задание
ЛегкоСообщите посетителю об успешном сохранении.
- В
events/views.pyдобавьте сообщение об успехе после каждого сохранения, перед перенаправлением: вnew_event—Your event was added., вedit_event—Your changes were saved., вdelete_event—The event was deleted. - В
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})
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Формы
Потренируйтесь самостоятельно: Песочница Django