Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Permite que los visitantes confirmen su asistencia.

  1. En events/forms.py, escribe un ModelForm RSVPForm para RSVP que solo incluya name y email.
  2. En event_detail, pasa un RSVPForm a la página como form. En una solicitud POST, créalo a partir de request.POST.
  3. Si es válido, guárdalo con commit=False, asígnale el evento, guárdalo, añade You'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

Practica por tu cuenta: Playground de Django