Validar la entrada
Parte de la sección Formularios del Journey de Django de Coddy. Lección 4 de 20.
Envía el formulario con un título vacío y el tablero recibe un evento sin nombre. Puede llegar cualquier cosa en request.POST, así que una vista lo comprueba antes de guardar.
Cuando la entrada es incorrecta, la vista no guarda nada ni redirige: vuelve a mostrar la página del formulario con un mensaje. Un formulario de reserva de mesa que acepta de 1 a 8 comensales:
guests = request.POST["guests"]
if not guests.isdigit() or not 1 <= int(guests) <= 8:
problem = "Choose between 1 and 8 guests."
return render(request, "tables/book.html", {"problem": problem})
Booking.objects.create(guests=int(guests))La comprobación se hace antes de create(): una vez guardada la fila, el mensaje llega demasiado tarde. Para el texto, .strip() elimina los espacios de ambos extremos, así que un título compuesto solo por espacios queda vacío. La plantilla muestra el mensaje solo cuando existe:
{% if problem %}
<p class="warning">{{ problem }}</p>
{% endif %}Desafío
FácilRechaza un evento sin título:
- Cuando el título está vacío o solo contiene espacios,
new_eventvuelve a mostrar la página del formulario conPlease give the event a title.encima del formulario y no guarda nada. - Un formulario con título sigue añadiendo el evento y redirige a él.
Pulsa Run y envía el formulario con un título de tres espacios.
Pruébalo tú mismo
from django.shortcuts import get_object_or_404, redirect, render
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":
event = Event.objects.create(
title=request.POST["title"],
date=request.POST["date"],
place=request.POST["place"],
)
return redirect("events:detail", pk=event.pk)
return render(request, "events/new_event.html")
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Formularios
1Formularios HTML
Un formulario de búsquedaUn formulario POSTRedirigir después de POST2Formularios 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