Menu
CoddyTech

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, solo con «Revisa el formulario». La vista comprobó el formulario que contenía lo que escribiste, luego lo descartó y creó uno nuevo y vacío.

Un formulario creado con datos está vinculado: ContactForm(request.POST) contiene lo que escribió quien visita la página y, después de is_valid(), los errores. ContactForm() está sin vincular: vacío y sin errores. Al mostrarse con {{ form }}, un formulario vinculado muestra cada valor y, junto al campo incorrecto, su error, como Enter a valid date.

Así que una vista con un formulario tiene tres casos:

  • Un GET: muestra un formulario sin vincular.
  • Un POST que falla: muestra el formulario vinculado que comprobó.
  • Un POST que se acepta: guarda y redirige.

Un solo render() al final sirve para los dos primeros casos.

challenge icon

Desafío

Fácil

Conserva lo que escribió el visitante después de un error.

  1. En new_event, muestra el formulario que comprobaste después de un POST fallido y un EventForm vacío en una solicitud GET.
  2. Elimina el mensaje de error de la vista y de new_event.html: ahora el formulario muestra sus propios errores.

Envía next friday como fecha: el título se conserva y «Enter a valid date.» aparece encima del campo Date.

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()})
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