Validazione dei vari campi del Form con Django
Validazione dei vari campi del Form con Django
Come effettuare la validazione dei vari campi del form con Django
La validazione dei dati è un aspetto importantissimo di un sito web, ecco quindi una guida su come effettuare la validazione dei vari campi del form con Django.
In un’altra guida abbiamo spiegato come effettuare l’elaborazione di una richiesta POST, in quel caso proveniente da un Form.
In questo caso ci vogliamo soffermare su come effettuare la validazione specifica per ogni campo di un Form.
Esempio semplicissimo
Mettiamo di avere il seguente form:
from django import forms class MioForm(forms.Form): primo = forms.CharField(label='Primo campo', max_length=100) secondo = forms.IntegerField(label='Secondo campo', max_length=100) terzo = forms.IntegerField(label='Terzo campo', max_length=100)
Vogliamo che il primo campo sia compreso tra 0 e 20.
Il secondo campo invece deve essere compreso tra 0 e 40.
Il secondo campo deve essere maggiore del primo.
Come fare? Semplicissmo.
Ecco il codice, facilissimo da capire:
from django import forms # Il mio form mostrato all'inizio class MioForm(forms.Form): primo = forms.CharField(label='Primo campo', max_length=100) secondo = forms.IntegerField(label='Secondo campo', max_length=100) terzo = forms.IntegerField(label='Terzo campo', max_length=100) # I metodi per validare il singolo dato devono avere questo formato clean_<nome_campo>(self) def clean_primo(self): """Metodo per verificare la validita del campo 'primo' """ data = self.cleaned_data['recipients'] numero = int(data) if numero < 0 or numero > 20: raise forms.ValidationError("Il numero non è compreso tra 0 e 20!") # Ritornare sempre data, anche se questa funzione non modifica nulla return data def clean_secondo(self): """Metodo per verificare la validita del campo 'secondo' """ data = self.cleaned_data['recipients'] numero = int(data) if numero < 0 or numero > 40: raise forms.ValidationError("Il numero non è compreso tra 0 e 40!") # Ritornare sempre data, anche se questa funzione non modifica nulla return data def clean(self): """Metodo per verificare i dati tra di loro, in questo caso per vedere se secondo è maggiore di primo""" cleaned_data = super().clean() primo = cleaned_data.get("primo") secondo = cleaned_data.get("secondo") if primo and secondo: # Fai qualcosa sono se entrambi i dati esistono. if int(secondo) > int(primo): raise forms.ValidationError("Il secondo campo non è maggiore del primo!")
In questo caso i campi del form erano testuali (CharField) quindi prima di verificare i dati li convertiamo in interi. Abbiamo fatto così per mantenere lo stesso form di esempio utilizzato su Coders Italia Forum.