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
EasyTell the visitor each save worked.
- In
events/views.py, add a success message after each save, before the redirect: innew_eventYour event was added., inedit_eventYour changes were saved., indelete_eventThe event was deleted. - In
base.html, above{% block content %}, show each message as an<li>inside<ul class="messages">, and draw the list only when there are messages.
Add an event: Your event was added. shows at the top, and a reload clears it.
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