Editar un evento
Parte de la sección Formularios del Journey de Django de Coddy. Lección 13 de 20.
Ahora cada página de evento tiene un enlace Editar este evento a /events/1/edit/. La URL, el enlace y la plantilla están listos, y edit_event ya encuentra el evento indicado por la URL. El resto de la vista te corresponde.
Un ModelForm edita una fila existente cuando le pasas esa fila como instance. Para una nota en una aplicación de notas:
note = get_object_or_404(Note, pk=4)
form = NoteForm(instance=note) # rellenado con los valores de la nota
form = NoteForm(request.POST, instance=note) # los nuevos valores para esta nota
if form.is_valid():
form.save() # actualiza la nota 4, no añade ninguna filaSin datos, NoteForm(instance=note) muestra el formulario rellenado con los valores actuales de la fila. Con datos, instance=note hace que form.save() actualice esa fila en lugar de crear una nueva.
Una página de edición necesita ambas cosas. Si olvidas la instancia en el GET, el visitante verá un formulario vacío; si la olvidas en el POST, al guardar se añadirá una copia.
Desafío
FácilCompleta edit_event en events/views.py:
- Una solicitud GET muestra el formulario rellenado con los detalles del evento.
- Una solicitud POST válida guarda los cambios en este evento, no añade ningún otro y redirige a su página.
- Una solicitud POST no válida vuelve a mostrar la página con los errores.
La plantilla necesita form y event. Pulsa Run y, después, pulsa Edit this event.
Pruébalo tú mismo
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 el formulario para este evento, valídalo y guárdalo, como en new_event.
return render(request, "events/edit_event.html", {"event": event})
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Formularios
2Formularios de Django
Un formulario de DjangoDibujar un formulario5Proyecto: Lista de invitados
Una confirmación de asistencia por correo electrónicoUna página para invitadosPractica por tu cuenta: Playground de Django