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

Desafío

Fácil

Rechaza un evento sin título.

  1. En new_event de events/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 mensaje Please give the event a title. Un formulario con título sigue añadiendo el evento y redirigiendo.
  2. 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")
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