Un formulario de confirmación
Parte de la sección Formularios del Journey de Django de Coddy. Lección 16 de 20.
Los visitantes quieren decir que asistirán. El proyecto tiene un nuevo modelo RSVP con una ForeignKey a Event (related_name="rsvps"), y cada página de evento tiene un formulario debajo del encabezado ¿Vienes?
El formulario de RSVP pide un nombre y un correo electrónico, nunca el evento: el visitante está en la página de ese evento, y un campo le permitiría elegir otro. Deja el evento fuera de fields y asígnalo en la vista.
form.save(commit=False) crea el objeto sin guardarlo, así que puedes establecer primero el resto. El formulario de pedido de una tienda nunca pregunta por el estado:
form = OrderForm(request.POST)
if form.is_valid():
order = form.save(commit=False)
order.status = "new"
order.save()Un form.save() normal guarda la fila de inmediato, y una ForeignKey obligatoria que se deja vacía provoca un error IntegrityError.
Desafío
IntermedioPermite que los visitantes confirmen su asistencia.
- En
events/forms.py, escribe un ModelFormRSVPFormparaRSVPque solo incluyanameyemail. - En
event_detail, pasa unRSVPForma la página comoform. En una solicitud POST, créalo a partir derequest.POST. - Si es válido, guárdalo con
commit=False, asígnale el evento, guárdalo, añadeYou're on the list!y redirige al evento. Si no, vuelve a mostrar el formulario.
Confirma tu asistencia a Friday Jazz Night: verás You're on the list!
Pruébalo tú mismo
from django.contrib import messages
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()
messages.success(request, "Your event was added.")
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)
if request.method == "POST":
form = EventForm(request.POST, instance=event)
if form.is_valid():
form.save()
messages.success(request, "Your changes were saved.")
return redirect("events:detail", pk=event.pk)
else:
form = EventForm(instance=event)
return render(request, "events/edit_event.html", {"form": form, "event": event})
def delete_event(request, pk):
event = get_object_or_404(Event, pk=pk)
if request.method == "POST":
event.delete()
messages.success(request, "The event was deleted.")
return redirect("events:list")
return render(request, "events/delete_event.html", {"event": event})
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