Das Django Message Framework

https://python.plainenglish.io/introduction-to-django-messaging-and-notification-tool-9f1878fc186d Häufig müssen dem User nach der Verarbeitung eines Formulars oder anderer Arten von Benutzereingabeneinmalige Nachrichten angezeigt werden. Diese Nachrichten sind auch als Flash-Messages. bekannt. Sie geben dem User Feedback über eine geglückte oder misslungene Aktion.

Dafür bietet Django volle Unterstützung für cookie- und sessionbasiertes Messaging, sowohl für anonyme als auch für authentifizierte Benutzer. Die Nachrichten ist mit einem Prioritätslevel gekennzeichnet, zb. „Info“ oder „Warning“.

Message-Level

Uns stehen 5 Nachrichten-Level zur Verfügung:

  • info

  • debug

  • success

  • warning

  • error

Frontendseitig könnte auf Basis dieser mitgesendeten Informationen die enstprechende CSS-Klasse gerendert werden.

Mehr infos: https://docs.djangoproject.com/en/stable/contrib/messages/#message-levels

In der function-based View eine Error-Message senden

In funktionsbasierten Views können wir das Messages-Objekt mit den enstprechenden Funktionen nutzen. In diesem Fall nutzen wir message.error, um eine Message mit Status error zu senden.

def add_category(request):
    if request.method == "POST":
        form = CategoryForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect("events:categories")
        else:
        # send flash message
        messages.error(request, "Das Form ist nicht valide!")

    else:
        form = CategoryForm()
    return render(
        request,
        "events/category_add.html",
        {"form": form},
    )

In der Create View eine Success-Meldung

In klassenbasierten Views Wir öffnen die Datei event_manager/events/views.py und fügen zur Klasse EventCreateView das Attribut success_message hinzu. Dafür müssen wir noch SuccessMessageMixin importieren und als Mixin für unsere View nutzen.

Um eine Message zu senden, wenn ein Fehler im Formular aufgetreten ist, können wir die Methode form_invalid überschreiben und die message von dort aus senden.

from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin

# anderer Code

class EventCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):

    model = Event
    form_class = EventForm
    success_message = "Der Event wurde erfolgreich eingetragen"

    def form_invalid(self, form):
        messages.error(self.request, "Das Form ist nicht valide!")
        return super().form_invalid(form)

Im Template die Message darstellen

Um die Messages darzustellen, brauchen wir einen zentralen Ort, damit wir es nicht in jedes Template schreiben müssen. Wir öffnen dazu die Datei event_manager/templates/base.html und fügen folgenden Code ein:

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>
        {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
        {{ message }}
    </li>
    {% endfor %}
</ul>
{% endif %}

Füllt der User jetzt das Formular aus, um einen Event zu erstellen und macht dabei einen Fehler, wird er wieder auf die Formularseite zurückgeschickt. Dort wird dann die Message angezeigt.

Nachdem eine Message angezeigt wurde, wird sie aus dem Storage-Backend gelöscht. Eine Message wird nur einmal angzeigt.

Mehr Infos: https://docs.djangoproject.com/en/stable/contrib/messages/