Сообщения об успешном выполнении
Часть раздела Формы путешествия по 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добавляй сообщение об успешном выполнении:Your event was added.,Your changes were saved.илиThe event was deleted. - В
base.html, перед{% block content %}, показывай сообщения в виде элементов<ul class="messages">, только если сообщения есть.
Нажми «Запустить», добавь событие, затем перезагрузи его страницу.
Попробуйте сами
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