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 la fecha de finalización no debe ser anterior a la de inicio. Un método clean_<field> examina un campo, así que una regla que abarque varios 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:
        self.add_error("phone", "Groups over 6 need a phone number.")
    return cleaned_data

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

self.add_error() coloca un mensaje bajo un campo. Lanzar forms.ValidationError en clean() genera un error de todo el formulario, que ningún campo muestra: lo hace {{ form.non_field_errors }}.

challenge icon

Desafío

Intermedio
  • Agrega end_date a EventForm después de date: una fecha que puede estar vacía.
  • Rechaza una fecha de finalización anterior a la de inicio con The event cannot end before it starts., un error de todo el formulario.
  • Guarda end_date en new_event.
  • Muestra los errores de todo el formulario encima de los campos.

Presiona Run y prueba una fecha de finalización anterior a la de inicio.

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