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 el título vacío y el tablero recibirá un evento sin nombre. Cualquier cosa puede llegar en request.POST, así que una vista lo comprueba antes de guardarlo.
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 para reservar una 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 formado 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.
- En
new_eventdeevents/views.py, cuando el título está vacío o solo contiene espacios, no guardes nada y vuelve a mostrar la página del formulario con el mensajePlease give the event a title.Un formulario con título sigue añadiendo el evento y redirigiendo. - En
new_event.html, muestra el mensaje encima del formulario solo cuando haya uno.
Envía un título de tres espacios: verás Please give the event a title. y no se guardará nada.
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