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, con solo "Please check the form." La vista dibujó un formulario nuevo y vacío, y el formulario que comprobó tenía los detalles.
Un formulario creado con datos está vinculado: ContactForm(request.POST) contiene lo que escribió el visitante y, después de is_valid(), los errores. ContactForm() está sin vincular: vacío, sin errores. Al dibujarse con {{ form }}, un formulario vinculado muestra cada valor y, debajo de un campo incorrecto, su error, como Enter a valid date.
Así que una vista con un formulario tiene tres casos:
- Un GET: mostrar un formulario sin vincular.
- Un POST que falla: mostrar el formulario vinculado que se comprobó.
- Un POST que pasa: guardar y redirigir.
Un solo render() al final sirve para los dos primeros.
Desafío
Fácil- En
new_event, muestra el formulario que se validó después de un POST fallido y uno vacío en una solicitud GET. - Elimina el mensaje de
errorde la vista y denew_event.html: ahora el formulario muestra sus propios errores.
Pulsa Run, envía el formulario con la fecha next friday y fíjate debajo de la fecha.
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