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, con solo "Please check the form." La vista dibujó un formulario nuevo y vacío, y el formulario que comprobó tenía los detalles.

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

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

  • Un GET: mostrar un formulario sin vincular.
  • Un POST que falla: mostrar el formulario vinculado que se comprobó.
  • Un POST que pasa: guardar y redirigir.

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

challenge icon

Desafío

Fácil
  • En new_event, muestra el formulario que se validó después de un POST fallido y uno vacío en una solicitud GET.
  • Elimina el mensaje de error de la vista y de new_event.html: ahora el formulario muestra sus propios errores.

Pulsa Run, envía el formulario con la fecha next friday y fíjate debajo de la fecha.

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