Menu
CoddyTech

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 righe

Senza 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.

challenge icon

Sfida

Facile

Completa 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})
quiz iconMettiti alla prova

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