Verificare due campi
Fa parte della sezione Form del percorso Django di Coddy. Lezione 11 di 20.
La Fiera del libro d'inverno dura tre giorni e una data di fine non deve precedere quella di inizio. Un metodo clean_<field> esamina un campo, quindi una regola che riguarda più campi va inserita in clean(), che viene eseguito dopo i controlli specifici di ogni campo. Un modulo di prenotazione in cui i gruppi di più di 6 persone devono lasciare un numero di telefono:
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 che non ha superato la convalida non è presente in cleaned_data, e una data facoltativa vuota è None, quindi usa .get() e confronta i valori solo quando sono presenti entrambi.
self.add_error() inserisce un messaggio sotto un campo. Sollevare forms.ValidationError in clean() genera un errore dell'intero modulo, che non viene visualizzato da nessun campo: a mostrarlo è {{ form.non_field_errors }}.
Sfida
Medio- Aggiungi
end_dateaEventFormdopodate: una data che può essere vuota. - Rifiuta una data di fine precedente a quella di inizio con
The event cannot end before it starts., un errore dell'intero modulo. - Salva
end_dateinnew_event. - Mostra gli errori dell'intero modulo sopra i campi.
Premi Esegui e prova a inserire una data di fine precedente a quella di inizio.
Provalo tu
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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Form
2Moduli Django
Un modulo DjangoCreare un moduloEsercitati da solo: Playground Django