Success Messages
Part of the Forms section of Coddy's Django journey. Lesson 15 of 20.
After saving, the visitor lands on the event's page, but nothing says the save worked. The view cannot pass a variable to that page: another view draws it, in the next request.
Django's messages framework carries a note across the redirect. The view adds it before redirecting; Django keeps it for that visitor and hands it to the next page drawn. A blog that saves a comment:
from django.contrib import messages
comment.save()
messages.success(request, "Thanks, your comment is posted.")
return redirect("blog:post", pk=post.pk)Every template gets a messages variable, so a base template can show them on every page:
{% for message in messages %}
<p class="note">{{ message }}</p>
{% endfor %}Looping over messages marks them as read, so each one shows once.
Challenge
Easy- After each save in
events/views.py, add a success message:Your event was added.,Your changes were saved.orThe event was deleted. - In
base.html, above{% block content %}, show the messages as items of a<ul class="messages">, only when there are some.
Press Run, add an event, then reload its page.
Try it yourself
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})
This lesson includes a short quiz. Start the lesson to answer it and track your progress.
All lessons in Forms
Practice on your own: Django playground