Formularios enlazados y no enlazados
Parte de la sección Formularios del Journey de Django de Coddy. Lección 7 de 20.
Envía el formulario con la fecha next friday: la página vuelve vacía, solo con «Revisa el formulario». La vista comprobó el formulario que contenía lo que escribiste, luego lo descartó y creó uno nuevo y vacío.
Un formulario creado con datos está vinculado: ContactForm(request.POST) contiene lo que escribió quien visita la página y, después de is_valid(), los errores. ContactForm() está sin vincular: vacío y sin errores. Al mostrarse con {{ form }}, un formulario vinculado muestra cada valor y, junto al campo incorrecto, su error, como Enter a valid date.
Así que una vista con un formulario tiene tres casos:
- Un GET: muestra un formulario sin vincular.
- Un POST que falla: muestra el formulario vinculado que comprobó.
- Un POST que se acepta: guarda y redirige.
Un solo render() al final sirve para los dos primeros casos.
Desafío
FácilConserva lo que escribió el visitante después de un error.
- En
new_event, muestra el formulario que comprobaste después de un POST fallido y unEventFormvacío en una solicitud GET. - Elimina el mensaje de
errorde la vista y denew_event.html: ahora el formulario muestra sus propios errores.
Envía next friday como fecha: el título se conserva y «Enter a valid date.» aparece encima del campo Date.
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):
error = None
if request.method == "POST":
form = EventForm(request.POST)
if form.is_valid():
event = Event.objects.create(
title=form.cleaned_data["title"],
date=form.cleaned_data["date"],
place=form.cleaned_data["place"],
)
return redirect("events:detail", pk=event.pk)
error = "Please check the form."
return render(request, "events/new_event.html", {"error": error, "form": EventForm()})
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