Cela fait un certain temps et la réponse votée par la communauté est assez bonne, basée sur les modules intégrés de Django, mais voici une autre approche, spécifique au problème, qui suit la méthode Documentation du projet Django .
Créer un validateur personnalisé
# app/models.py or create another file for custom validators, i.e. app/custom_validators.py
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _ # use if you support internationalization
def validate_interval(value):
if value < 0.0 or value > 1.0:
raise ValidationError(_('%(value)s must be in the range [0.0, 1.0]'), params={'value': value},)
Utilisez votre validateur dans vos modèles
# app/models.py
class Foo(models.Model):
myfloat = models.FloatField(validators=[validate_interval])
Vous pouvez même rendre le validateur paramétrique pour qu'il soit plus générique.
EDIT - IMPORTANT
Il faut garder à l'esprit que tout validateur est invoqué pendant la phase d'élaboration du formulaire. clean()
méthode.
Par exemple, si vous essayez de créer directement un objet sans utiliser de formulaire, votre validateur va PAS soit invoquée.
Certains ne le recommandent pas, mais si vous souhaitez invoquer des validateurs lors de la création d'un objet, remplacez la méthode save.
# app/models.py
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _ # use if you support internationalization
class Foo(models.Model):
def save(self, *args, **kwargs):
self.full_clean() # or clean
super().save(*args, **kwargs)
def validate_interval(value):
if value < 0.0 or value > 1.0:
raise ValidationError(_('%(value)s must be in the range [0.0, 1.0]'), params={'value': value},)
myfloat = models.FloatField(validators=[validate_interval])