Menu
CoddyTech

Formulaires liés et non liés

Fait partie de la section Formulaires du Journey Django de Coddy. Leçon 7 sur 20.

Envoyez le formulaire avec la date next friday : la page revient vide, avec seulement « Veuillez vérifier le formulaire. » La vue a affiché un nouveau formulaire vide, tandis que le formulaire qu’elle a vérifié contenait les informations.

Un formulaire construit avec des données est lié : ContactForm(request.POST) contient ce que le visiteur a saisi et, après is_valid(), les erreurs. ContactForm() est non lié : vide et sans erreurs. Affiché avec {{ form }}, un formulaire lié montre chaque valeur et, sous un champ incorrect, son erreur, par exemple Enter a valid date.

Une vue avec un formulaire comporte donc trois cas :

  • Une requête GET : afficher un formulaire non lié.
  • Une requête POST qui échoue : afficher le formulaire lié qu’elle a vérifié.
  • Une requête POST qui réussit : enregistrer et rediriger.

Un seul render() à la fin suffit pour les deux premiers cas.

challenge icon

Défi

Facile
  • Dans new_event, affiche le formulaire qui a été vérifié après un POST échoué, et un formulaire vide lors d’une requête GET.
  • Supprime le message d’error de la vue et de new_event.html : le formulaire affiche maintenant ses propres erreurs.

Appuie sur Run, envoie le formulaire avec la date next friday, puis regarde sous la date.

Essayez vous-même

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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Formulaires

Entraînez-vous par vous-même : Playground Django