Menu
CoddyTech

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 %}
challenge icon

Desafío

Fácil

Rechaza un evento sin título:

  • Cuando el título está vacío o solo contiene espacios, new_event vuelve a mostrar la página del formulario con Please 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")
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Formularios

Practica por tu cuenta: Playground de Django