Menu
CoddyTech

Gebundene und ungebundene Formulare

Teil des Abschnitts Formulare der Django-Journey von Coddy. Lektion 7 von 20.

Sende das Formular mit dem Datum next friday: Die Seite wird leer angezeigt, nur mit „Bitte überprüfe das Formular.“ Die View hat das Formular geprüft, das deine Eingaben enthielt, es dann verworfen und ein neues, leeres Formular erstellt.

Ein Formular, das mit Daten erstellt wurde, ist gebunden: ContactForm(request.POST) enthält die Eingaben des Besuchers und nach is_valid() die Fehler. ContactForm() ist ungebunden: leer und ohne Fehler. Wird es mit {{ form }} dargestellt, zeigt ein gebundenes Formular jeden Wert und neben einem fehlerhaften Feld den zugehörigen Fehler an, zum Beispiel Enter a valid date.

Eine View mit einem Formular hat also drei Fälle:

  • Ein GET: ein ungebundenes Formular rendern.
  • Ein POST, der fehlschlägt: das gebundene Formular rendern, das geprüft wurde.
  • Ein POST, der erfolgreich ist: speichern und weiterleiten.

Ein einziges render() am Ende übernimmt die ersten beiden Fälle.

challenge icon

Aufgabe

Einfach

Behalte nach einem Fehler, was der Besucher eingegeben hat.

  1. Rendere in new_event nach einem fehlgeschlagenen POST das geprüfte Formular und bei einem GET ein leeres EventForm.
  2. Entferne die Meldung error aus der View und aus new_event.html: Das Formular zeigt seine Fehler jetzt selbst an.

Sende next friday als Datum: Dein Titel bleibt erhalten, und über dem Datumsfeld erscheint Enter a valid date.

Probier es selbst

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):
    error = None
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = Event.objects.create(
                title=form.cleaned_data["title"],
                date=form.cleaned_data["date"],
                place=form.cleaned_data["place"],
            )
            return redirect("events:detail", pk=event.pk)
        error = "Please check the form."
    return render(request, "events/new_event.html", {"error": error, "form": EventForm()})
quiz iconTeste dich selbst

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