2010-01-26 5 views
1

Disons que j'ai un modèle:Django: Est-ce que model_instance.clean() s'exécute avant les validateurs de base?

class Ticket(models.Model): 
    client = models.ForeignKey(Client) 
    color = models.CharField(max_length=255) 

    def clean(self): 
     self.color = self.client.favorite_color 

Quand je lance ce sur le dernier Django (chef du SVN d'il y a 15 minutes), si je frappe enregistrer sans sélectionner client, je reçois une erreur DoesNotExist de l'intérieur de ma méthode propre (pour la partie self.client.favorite_color). Puisque le modèle nécessite l'attribut client, ne devrait-il pas être traité avant ma validation personnalisée dans clean()?

est ici la documentation que je lis: http://docs.djangoproject.com/en/dev/ref/models/instances/#id1

+1

Je pensais que c'était seulement pour ModelForms? – fijter

+0

@ D4V360: L'OP fait référence à la version SVN. La méthode 'clean' a été introduite. Voir toutes les méthodes du modèle: http://docs.djangoproject.com/fr/dev/ref/models/instances/#ref-models-instances –

+0

Si vous voulez dérouler le SVN, tirez de la révision # 12267. Dans # 12268 et forward jusqu'à ce qu'ils corrigent (je mets un ticket), si vous élevez un ValidationError ('avec une chaîne comme celle qui est documentée'), une erreur d'exécution se produit dans django.forms.models en raison d'un punaise. 12268 est l'endroit où ce bug a été introduit. – orokusaki

Répondre

1

I figured it out si quelqu'un se jette dans ce problème:

En full_clean() sur le modèle, premier est exécuté clean_fields(), mais aucune erreur sont élevés pour l'affichage, etc. Ils sont plutôt simplement ajoutés un dict(), puis clean(), qui est la méthode de validation personnalisée pour votre modèle est exécuté pour ajouter l'une de vos erreurs personnalisées à la dict. Ce n'est qu'après que les erreurs sont à nouveau soulevées. Pouvez-vous utiliser la fonction de nettoyage sur les modèles?

-3

clean() est un appelable de ModelForms, pas de modèles.

See the docs.

faire ce que vous semblez vouloir le faire au niveau du modèle, override the save() method.

Modifier après commentaire: Eh bien, il semble qu'il est temps de lire la documentation tout recommencer avec 1.2 imminent. :-) Merci de l'avoir signalé.

+4

clean() est aussi une méthode de modélisation. Voici un lien: http://docs.djangoproject.com/en/dev/ref/models/instances/#id1 – orokusaki

+0

@celopes LOL, je sais. Je me plaindrais mais je suis assez tôt dans mon projet pour que je réduise le SVN chaque semaine et que je corrige des bugs au fur et à mesure car cette validation est quelque chose dont j'ai toujours rêvé et il y a plus de nouvelles choses comme queryset.exists() , etc. Si vous allez utiliser SVN pour cette nouvelle validation, j'accepterais la révision # 12268. – orokusaki

Questions connexes