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

challenge icon

Sfida

Medio

Gli eventi ricevono una data di fine.

  1. In events/forms.py, aggiungi un campo data facoltativo end_date a EventForm. Scrivi clean(): quando sono presenti entrambe le date e quella di fine precede quella di inizio, solleva The event cannot end before it starts.. Leggi le date con .get().
  2. In new_event, salva anche end_date.
  3. In new_event.html, mostra form.non_field_errors sopra 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
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