61 votes

Django - Comment spécifier sur quel champ une validation échoue ?

J'ai ce modèle que je montre dans la page d'administration :

 class Dog(models.Model):
    bark_volume = models.DecimalField(...
    unladen_speed = models.DecimalField(...

    def clean(self):
        if self.bark_volume < 5:
            raise ValidationError("must be louder!")

Comme vous pouvez le voir, j'ai mis une validation sur le modèle. Mais ce que je veux, c'est que la page d'administration affiche l'erreur à côté du champ bark_volume au lieu d'une erreur générale comme c'est le cas maintenant. Existe-t-il un moyen de spécifier sur quel champ la validation échoue ?

Merci beaucoup d'avance.

121voto

Greg Points 7098

OK, je l'ai compris à partir de cette réponse .

Vous devez faire quelque chose comme ceci :

 class Dog(models.Model):
    bark_volume = models.DecimalField(...
    unladen_speed = models.DecimalField(...

    def clean_fields(self):
        if self.bark_volume < 5:
            raise ValidationError({'bark_volume': ["Must be louder!",]})

10voto

streetlogics Points 1558

A noter pour tous ceux qui pourraient rencontrer cela avec une version plus récente de Django - la méthode clean_fields de la réponse acceptée nécessite désormais un paramètre "exclude". Aussi - je crois que la réponse acceptée manque également un appel à sa super fonction. Le code final que j'ai utilisé était :

 def clean_fields(self, exclude=None):
    super(Model, self).clean_fields(exclude)

    if self.field_name and not self.field_name_required:
        raise ValidationError({'field_name_required':["You selected a field, so field_name_required is required"]})

7voto

Chase Points 1052

abrégé, à partir de la doc django :

 def clean(self):
    data = self.cleaned_data
    subject = data.get("subject")

    if subject and "help" not in subject:
        msg = "Must put 'help' in subject."
        self.add_error('subject', msg)

    return data

6voto

Mike DeSimone Points 20059

Utilisez une clean_ spécifique au champ :

 class DogForm(forms.ModelForm):
    class Meta:
        model = Dog

    def clean_bark_volume(self):
        if self.cleaned_data['bark_volume'] < 5:
            raise ValidationError("must be louder!")

Voir la partie clean<fieldname> de la page de validation de formulaire . Assurez-vous également d'utiliser cleaned_data au lieu du champ de formulaire lui-même ; ce dernier peut avoir des données anciennes. Enfin, faites-le sur le formulaire et non sur le modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X