Menu
CoddyTech

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_data

Un 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 }}.

challenge icon

Sfida

Medio
  • Aggiungi end_date a EventForm dopo date: 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_date in new_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
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Form

Esercitati da solo: Playground Django