Menu
CoddyTech

Validar dos campos

Parte de la sección Formularios del Journey de Django de Coddy. Lección 11 de 20.

La Feria del Libro de Invierno dura tres días, y una fecha de finalización no debe ser anterior a la de inicio. Un método clean_<field> examina un campo, así que una regla entre campos va en clean(), que se ejecuta después de las comprobaciones propias de cada campo. Un formulario de reserva en el que un grupo de más de 6 personas debe proporcionar un número de teléfono:

def clean(self):
    cleaned_data = super().clean()
    guests = cleaned_data.get("guests")
    phone = cleaned_data.get("phone")
    if guests and guests > 6 and not phone:
        raise forms.ValidationError("Groups over 6 need a phone number.")
    return cleaned_data

Un campo que no superó la validación falta en cleaned_data, y una fecha opcional vacía es None, así que usa .get() para leerla y compara solo cuando ambos valores estén presentes.

Un error generado en clean() corresponde a todo el formulario, así que el bucle de campos no lo muestra. {{ form.non_field_errors }} sí lo hace.

challenge icon

Desafío

Intermedio

Los eventos tienen una fecha de finalización.

  1. En events/forms.py, añade un campo de fecha opcional end_date a EventForm. Escribe clean(): cuando estén las dos fechas y la fecha de finalización sea anterior, genera The event cannot end before it starts. Lee las fechas con .get().
  2. En new_event, guarda también end_date.
  3. En new_event.html, muestra form.non_field_errors antes del bucle.

Establece la fecha de finalización antes de la fecha de inicio: verás ese mensaje.

Pruébalo tú mismo

import datetime

from django import forms


class EventForm(forms.Form):
    title = forms.CharField(max_length=100)
    date = forms.DateField()
    place = forms.CharField(max_length=100)
    description = forms.CharField(widget=forms.Textarea, required=False)
    capacity = forms.IntegerField(min_value=1)

    def clean_date(self):
        date = self.cleaned_data["date"]
        if date < datetime.date.today():
            raise forms.ValidationError("The date cannot be in the past.")
        return date
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