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 ligneSans 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.
Défi
FacileTermine 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})
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
3Formulaires de modèle
Un formulaire de modèleModifier un événementSupprimer un événementMessages de réussiteEntraînez-vous par vous-même : Playground Django