Menu
CoddyTech

Modifier un événement

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

Chaque page d’événement comporte désormais un lien Modifier cet événement vers /events/1/edit/. L’URL, le lien et le modèle sont prêts, et edit_event trouve déjà l’événement désigné par l’URL. À toi de compléter le reste de la vue.

Un ModelForm modifie une ligne existante si tu lui transmets cette ligne comme instance. Pour une note dans une application de prise de notes :

note = get_object_or_404(Note, pk=4)

form = NoteForm(instance=note)                # prérempli avec les valeurs de la note

form = NoteForm(request.POST, instance=note)  # les nouvelles valeurs pour cette note
if form.is_valid():
    form.save()                               # met à jour la note 4 sans ajouter de ligne

Sans données, NoteForm(instance=note) affiche le formulaire prérempli avec les valeurs actuelles de la ligne. Avec des données, instance=note fait en sorte que form.save() mette à jour cette ligne au lieu d’en créer une nouvelle.

Une page de modification a besoin des deux. Si tu oublies l’instance lors du GET, le visiteur voit un formulaire vide ; si tu l’oublies lors du POST, l’enregistrement ajoute une copie.

challenge icon

Défi

Facile

Termine edit_event dans events/views.py en remplaçant son commentaire. Le render() à la fin transmet déjà event ; ajoute form à côté.

  • Une requête GET affiche le formulaire prérempli avec les détails de l’événement.
  • Une requête POST valide enregistre les modifications, n’ajoute aucun nouvel événement et redirige vers sa page.
  • Une requête POST invalide affiche à nouveau la page avec les erreurs.

Remplace Place par Town Hall et clique sur « Enregistrer les modifications » : la page de l’événement indique Town Hall.

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):
    if request.method == "POST":
        form = EventForm(request.POST)
        if form.is_valid():
            event = form.save()
            return redirect("events:detail", pk=event.pk)
    else:
        form = EventForm()
    return render(request, "events/new_event.html", {"form": form})


def edit_event(request, pk):
    event = get_object_or_404(Event, pk=pk)
    # Créez le formulaire pour cet événement, validez-le et enregistrez-le, comme dans new_event.
    return render(request, "events/edit_event.html", {"event": event})
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