2009-09-24 5 views
11

Je dois lever une exception dans la méthode de sauvegarde d'un modèle. J'espère qu'une exception existe qui sera attrapée par n'importe quel django ModelForm qui utilise ce modèle, y compris les formulaires d'administration.Raising ValidationError à partir de la méthode de sauvegarde du modèle django?

J'ai essayé d'élever django.forms.ValidationError, mais cela semble être non pris par les formulaires d'administration. Le modèle effectue un appel de procédure à distance au moment de la sauvegarde et il n'est pas connu avant cet appel si l'entrée est valide.

Merci, Pete

Répondre

8

Il n'y a actuellement aucun moyen d'effectuer la validation dans le modèle d'économie méthodes. Ceci est cependant en cours de développement, en tant que branche distincte de validation de modèle, et devrait être fusionné dans le tronc dans les prochains mois.

En attendant, vous devez effectuer la validation au niveau du formulaire. Il est assez simple de créer une sous-classe ModelForm avec une méthode clean() qui effectue votre appel distant et déclenche l'exception en conséquence, et l'utilise à la fois dans l'admin et comme base pour vos autres formulaires.

+3

django m'a battu récemment. Je suis allé avec cette approche, mais je ne suis pas satisfait. Le code qui modifie un modèle n'appartient pas à une méthode propre. – slypete

+0

Juste à l'enregistrement, cette branche dont vous avez parlé a-t-elle déjà été fusionnée? – rennat

+5

Cela fait partie de Django 1.2: http://docs.djangoproject.com/fr/dev/ref/models/instances/#validating-objects – Tom

10

Depuis Django 1.2, c'est ce que je fais:

class MyModel(models.Model): 

    <...model fields...> 

    def clean(self, *args, **kwargs): 
     if <some constraint not met>: 
      raise ValidationError('You have not met a constraint!') 
     super(MyModel, self).clean(*args, **kwargs) 

    def full_clean(self, *args, **kwargs): 
     return self.clean(*args, **kwargs) 

    def save(self, *args, **kwargs): 
     self.full_clean() 
     super(MyModel, self).save(*args, **kwargs) 

Ceci a l'avantage de travailler à la fois à l'intérieur et à l'extérieur d'admin.

Questions connexes