Modificare un evento
Fa parte della sezione Form del percorso Django di Coddy. Lezione 13 di 20.
Ora ogni pagina di un evento ha un link Modifica questo evento a /events/1/edit/. L’URL, il link e il template sono pronti, e edit_event trova già l’evento indicato dall’URL. Il resto della vista spetta a te.
Un ModelForm modifica una riga esistente quando gli passi quella riga come instance. Per una nota in un’app per prendere appunti:
note = get_object_or_404(Note, pk=4)
form = NoteForm(instance=note) # compilato con i valori della nota
form = NoteForm(request.POST, instance=note) # i nuovi valori per questa nota
if form.is_valid():
form.save() # aggiorna la nota 4, non aggiunge righeSenza dati, NoteForm(instance=note) visualizza il modulo compilato con i valori correnti della riga. Con i dati, instance=note fa sì che form.save() aggiorni quella riga invece di crearne una nuova.
Una pagina di modifica ha bisogno di entrambe le cose. Se dimentichi l’istanza nella GET, il visitatore vedrà un modulo vuoto; se la dimentichi nella POST, il salvataggio aggiungerà una copia.
Sfida
FacileCompleta edit_event in events/views.py:
- Una richiesta GET mostra il modulo compilato con i dettagli dell'evento.
- Una richiesta POST valida salva le modifiche a questo evento, non ne aggiunge uno nuovo e reindirizza alla sua pagina.
- Una richiesta POST non valida mostra nuovamente la pagina con gli errori.
Il modello richiede form e event. Premi Run, poi premi Modifica questo evento.
Provalo tu
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)
# Prepara il modulo per questo evento, verifica che sia valido e salvalo, come in new_event.
return render(request, "events/edit_event.html", {"event": event})
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Form
Esercitati da solo: Playground Django