Eingaben überprüfen
Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 4 von 20.
Sende das Formular mit einem leeren Titel ab, und auf dem Board wird ein Ereignis ohne Namen erstellt. In request.POST kann alles ankommen, deshalb prüft eine View die Daten, bevor sie sie speichert.
Wenn die Eingabe falsch ist, speichert die View nichts und leitet nicht weiter: Sie rendert die Formularseite erneut und zeigt eine Meldung an. Ein Tischreservierungsformular, das 1 bis 8 Gäste akzeptiert:
guests = request.POST["guests"]
if not guests.isdigit() or not 1 <= int(guests) <= 8:
problem = "Choose between 1 and 8 guests."
return render(request, "tables/book.html", {"problem": problem})
Booking.objects.create(guests=int(guests))Die Prüfung erfolgt vor create(): Sobald der Datensatz gespeichert ist, kommt die Meldung zu spät. Bei Text entfernt .strip() die Leerzeichen an beiden Enden, sodass ein Titel, der nur aus Leerzeichen besteht, leer wird. Das Template zeigt die Meldung nur an, wenn es eine gibt:
{% if problem %}
<p class="warning">{{ problem }}</p>
{% endif %}Aufgabe
EinfachLehne eine Veranstaltung ohne Titel ab.
- Wenn der Titel in
new_eventinevents/views.pyleer ist oder nur Leerzeichen enthält, speichere nichts und rendere die Formularseite erneut mit der MeldungPlease give the event a title.. Ein Formular mit einem Titel fügt die Veranstaltung weiterhin hinzu und leitet weiter. - Zeige in
new_event.htmldie Meldung nur dann oberhalb des Formulars an, wenn es eine gibt.
Gib einen Titel aus drei Leerzeichen ein: Du siehst Please give the event a title. und es wird nichts gespeichert.
Probier es selbst
from django.shortcuts import get_object_or_404, redirect, render
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":
event = Event.objects.create(
title=request.POST["title"],
date=request.POST["date"],
place=request.POST["place"],
)
return redirect("events:detail", pk=event.pk)
return render(request, "events/new_event.html")
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Formulare
Übe selbstständig: Django-Playground