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/