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_dataUn 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 }}.
Desafío
Intermedio- Agrega
end_dateaEventFormdespués dedate: 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_dateennew_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
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Formularios
2Formularios de Django
Un formulario de DjangoDibujar un formulario5Proyecto: Lista de invitados
Una confirmación de asistencia por correo electrónicoUna página para invitadosPractica por tu cuenta: Playground de Django