Menu
CoddyTech

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 icon

Challenge

Easy
  • After each save in events/views.py, add a success message: Your event was added., Your changes were saved. or The 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})
quiz iconTest yourself

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