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, non aggiunge righe

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

challenge icon

Sfida

Facile

Completa 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})
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