2016-04-14 1 views
0

J'ai écrit un validateur personnalisé, qui déclenchera ValidationError si la valeur de champ donnée est négative.Django Custom Validators ne fonctionne pas

def validate_positive(value): 
     if value < 0: 
      raise ValidationError(
        _('%(value) is negative number'), 
        params = {'value': value} 
        ) 

i a ajouté à mon champ de modèle via l'argument de validateurs de champ

class Book(models.Model): 
    user = models.ForeignKey(User,on_delete=models.CASCADE) 
    title = models.CharField(max_length=50) 
    price = models.IntegerField(default=0,validators=[validate_positive]) 
    quantity = models.IntegerField(default=0,validators=[validate_positive]) 

Mais tout en créant l'objet ce n'est pas formuler d'erreur si le prix est inférieur à zéro.
Je ne sais pas où je me trompe et je suis nouveau à django. J'utilise Django 1.9.
S'il vous plaît aidez-moi.

+0

Les validateurs sont utilisés pour les formulaires, pas pour créer un objet. Si vous créez un objet en dehors d'un formulaire, vous devez fournir une méthode alternative pour valider l'entrée. – Sayse

+0

@Sayse alors comment valider l'entrée qui est donnée aux champs du modèle? – rock

Répondre

5

Les validateurs sont utilisés pour les formulaires, pas pour créer un objet. Si vous créez un objet en dehors d'un formulaire, vous devez fournir une méthode alternative pour valider l'entrée.

La meilleure façon de le faire est d'appeler la méthode full_clean du modèle avant de l'enregistrer comme indiqué dans le docs

from django.core.exceptions import ValidationError 
try: 
    article.full_clean() 
except ValidationError as e: 
    # Do something based on the errors contained in e.message_dict. 
    # Display them to a user, or handle them programmatically. 
    pass 

Ceci est similaire à ce qui se passerait d'une forme, et appelleraient des validateurs sur votre modèle des champs.

+0

donc je dois redéfinir la méthode save() pour valider le modèle. – rock

+0

@rock - Non, pas vraiment, parce que cela vous permettrait de valider deux fois chaque fois que vous utilisez un formulaire (modèle). Vous avez juste besoin de vous assurer de faire la validation avant d'enregistrer. faire une méthode 'save_and_validate' si vous voulez vraiment – Sayse

+1

Merci pour la solution. – rock