2017-06-03 1 views
-1

J'ai quelques objets models.CharField dans mon modèle, avec l'attribut choices.Forcer les choix de CharField

Cela fonctionne très bien en ce qui concerne l'interface graphique, mais je veux bloquer les valeurs autres que celles spécifiées dans l'attribut choices dans le code lui-même (pour me protéger contre les bogues).

Existe-t-il un moyen de déclencher une exception (je crois que ce sera un ValueError) lorsque vous essayez d'enregistrer une chaîne qui ne figure pas dans la liste de choix?

+0

Pourquoi les downvotes? Veuillez clarifier que c'est faux avec la question. – iTayb

Répondre

1

Vous pourriez override the save method de votre modèle pour élever votre propre exception:

class MyModel: 

    MY_CHOICES = (
     # choices here 
    ) 

    myfield = models.CharField(max_length=100, choices=MY_CHOICES) 

    def save(self, *args, **kwargs): 
     choice = self.myfield 
     if not any(choice in _tuple for _tuple in self.MY_CHOICES): 
      raise ValueError('An error message.') 
     super(MyModel, self).save(*args, **kwargs) 
+0

Vient de voir cette réponse: https://stackoverflow.com/questions/9048108/django-overriding-model-clean-vs-save. La méthode clean() semble être l'endroit préféré pour la validation de formulaire, selon la réponse de Fazil. De plus, si vous augmentez ValidationError à l'intérieur de clean(), il l'ajoute automatiquement à form.non_field_errors (bien que cela soit moins pertinent si vous utilisez l'attribut 'choices' et le widget de formulaire associé pour limiter les options). – birophilo

0

Vous pouvez utiliser la méthode de modèle propre pour que,

class YourModel(models.Model): 
    CHOICES = ('your_choices_here',) 

    def clean(self): 
     if not any(self.field_name in item for item in self.CHOICES): 
      raise ValueError("Your error message here.")