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 indicar 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 bajo ¿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 fuera de fields lo que decide la vista y establécelo 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() simple almacena la fila de inmediato, y dejar vacío un ForeignKey obligatorio provoca un error IntegrityError.
Desafío
Intermedio- En
events/forms.py, añadeRSVPForm, un ModelForm paraRSVPque solicite únicamentenameyemail. - En
event_detail, pásalo a la plantilla comoform. Un POST válido guarda el RSVP para este evento, añade el mensajeYou're on the list!y redirige a la página del evento.
Pulsa Run, abre un evento y confirma tu asistencia.
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