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, senza aggiungere righeSenza dati, NoteForm(instance=note) mostra il modulo compilato con i valori attuali 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 richiesta GET, il visitatore vede un modulo vuoto; se la dimentichi nella richiesta POST, il salvataggio aggiunge una copia.
Sfida
FacileCompleta edit_event in events/views.py sostituendo il suo commento. La chiamata a render() alla fine passa già event; aggiungi form accanto.
- Una richiesta GET mostra il modulo compilato con i dettagli dell'evento.
- Una richiesta POST valida salva le modifiche, non aggiunge un nuovo evento e reindirizza alla pagina dell'evento.
- Una richiesta POST non valida mostra di nuovo la pagina con gli errori.
Modifica Place in Town Hall e premi Save changes: la pagina dell'evento mostra Town Hall.
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)
# Crea il modulo per questo evento, verificalo 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