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

challenge icon

Desafío

Intermedio
  • En events/forms.py, añade RSVPForm, un ModelForm para RSVP que solicite únicamente name y email.
  • En event_detail, pásalo a la plantilla como form. Un POST válido guarda el RSVP para este evento, añade el mensaje You'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

Practica por tu cuenta: Playground de Django