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_dataUn 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.
Desafío
IntermedioLos eventos tienen una fecha de finalización.
- En
events/forms.py, añade un campo de fecha opcionalend_dateaEventForm. Escribeclean(): cuando estén las dos fechas y la fecha de finalización sea anterior, generaThe event cannot end before it starts.Lee las fechas con.get(). - En
new_event, guarda tambiénend_date. - En
new_event.html, muestraform.non_field_errorsantes 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
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