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> controlla un solo campo, quindi una regola che riguarda più campi va in clean(), che viene eseguito dopo i controlli specifici di ogni campo. Un modulo di prenotazione in cui un gruppo di più di 6 persone deve 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:
raise forms.ValidationError("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 entrambi presenti.
Un errore sollevato in clean() riguarda l’intero modulo, quindi il ciclo dei campi non lo visualizza. A farlo è {{ form.non_field_errors }}.
Sfida
MedioGli eventi ricevono una data di fine.
- In
events/forms.py, aggiungi un campo data facoltativoend_dateaEventForm. Scriviclean(): quando sono presenti entrambe le date e quella di fine precede quella di inizio, sollevaThe event cannot end before it starts.. Leggi le date con.get(). - In
new_event, salva ancheend_date. - In
new_event.html, mostraform.non_field_errorssopra il ciclo.
Imposta la data di fine prima di quella di inizio: vedrai quel messaggio.
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