Django : un modèle sur mesure : DaysField étape 3/3
Formulaire spécifique pour un modèle sur-mesure
Après les conversions de notre modèle dans les deux sens :
Il ne nous reste qu’à faire le validateur = s’assurer que ce qui arrive (peu importe la source : base de données ou code Python) :
- est bien un tableau :
- que ce tableau n’est rempli que d’entiers ;
- que chacun de ces entiers est compris entre
1
et7
.
Il faut créer une classe, qui doit implémenter __call__
. Vous ne savez pas ce que c’est ? L’explication sur SO ici est excellente.
En une phrase : __init__()
est appelé lorsque la classe est instanciée, __call__
est appelé lorsque l’instance est appelée (avec des ()
)
class ListBetween1And7Validator:
def __call__(self, value):
try:
if isinstance(value, list):
loop = [int(a) for a in value]
elif isinstance(value, str):
loop = [int(a) for a in value.strip('[]').split(',')]
else:
raise ValueError()
for v in loop:
if not (7 >= v >= 1):
raise ValueError()
except (TypeError, ValueError):
raise ValidationError(
_("Enter a list if coma-separated values between 1 and 7."),
code='invalid')
Puis il faut le déclarer dans la liste des validateurs de notre classe :
default_validators = [ListBetween1And7Validator()]
Dans le prochain et dernier article, je mets le code source au complet.