2010-11-26 3 views
1

Ceci est une version très simplifiée d'un modèle sur lesquels je travaille:Manipulation des exigences des champs du modèle Django qui sont basés sur d'autres domaines

class ClothingTop(models.Model): 

    SWEATER = 0 
    SHIRT = 1 

    TOP_CHOICES = (
     (SWEATER, 'Sweat shirt'), 
     (SHIRT, 'Shirt'), 
    ) 

    name = models.CharField(max_length=32) 
    type = models.PositiveSmallIntegerField(choices=TOP_CHOICES) 
    hoodie = models.BooleanField(default=False) 
    buttons = models.PositiveSmallIntegerField(null=True, blank=True) 

    def __unicode__(self): 
     return self.name 

    @property 
    def type_text(self): 
     if self.type == self.SWEATER: 
      if self.hoodie: 
       return 'Hooded sweatshirt' 
      return 'Plain sweatshirt' 
     elif self.type == self.SHIRT: 
      return 'Shirt' 

Je veux exiger buttons si le type est réglé sur SHIRT . Ma première pensée a été de remplacer la méthode save mais je ne suis pas sûr que ce soit nécessairement la façon la plus intelligente d'y arriver.

Quelqu'un a des suggestions?

Répondre

1

Ma suggestion simple, et je crois qu'il est le meilleur dans la pratique, est que vous créez un ClothingTopModelForm et définir la méthode buttons_clean() sur le formulaire qui fera la validation personnalisée. Cette forme devrait également être fixée pour la ClothingTopModelAdmin. La seule autre façon de le faire est de créer un champ de modèle personnalisé pour le champ buttons (les validateurs ne fonctionneront pas ici car ils n'obtiennent que la valeur du champ des boutons et ignorent le type, les autres champs du modèle). La meilleure façon de le faire serait:

ButtonsField(models.PositiveSmallIntegerField): 

    def validate(self, value, model_instance): 
     # here we get the buttons field value and can get the type value 
     # exactly what we need! 

     type = getattr(model_instance, 'type') 

     if type == SHIRT and not value: 
      raise ValidationError('Type set to shirt, but buttons value is empty') 

     super(self, ButtonsField).validate(value, model_instance) 

je l'ai mentionné l'approche des champs personnalisés pour être complet, je pense que vous devriez ignorer la création d'un type de champ personnalisé à moins il est complètement générique et facilement réutilisable sur un modèle. Pour ces cas particuliers, utilisez simplement la validation de formulaire. Vos modèles doivent uniquement garantir l'intégrité de la base de données, ce que vous avez déjà couvert avec ClothingTop déjà, les règles d'entreprise dépendant de la validation du formulaire.

+0

Avec cette solution, je devrais également fournir un formulaire pour l'application d'administration correcte? –

+0

ouais, vous auriez besoin d'avoir 'form = forms.ClothingTopForm' sur votre' ModelAdmin'. Vous en aurez besoin pour vous assurer que les utilisateurs professionnels sont limités par les règles métier. –

+0

+1, merci KRON pour la réponse rapide. –

Questions connexes