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 maintenant 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 lorsqu’on lui transmet 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 dans la requête GET, le visiteur voit un formulaire vide ; si tu l’oublies dans la requête POST, l’enregistrement ajoute une copie.

challenge icon

Défi

Facile

Termine edit_event dans events/views.py :

  • 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 apportées à cet événement, n’en ajoute aucun nouveau et redirige vers sa page.
  • Une requête POST invalide réaffiche la page avec les erreurs.

Le modèle nécessite form et event. Appuie sur Run, puis sur Edit this event.

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