2011-06-01 1 views
8

J'ai un modèle comme celui-ci:Django - comment définir blanc = False, nécessaire = Faux

class Message(models.Model): 
    msg = models.CharField(max_length = 150) 

et j'ai un formulaire pour insérer le champ. En fait django permet des espaces vides, par exemple si j'insère dans le champ un espace cela fonctionne. Mais maintenant je veux corriger ceci: le champ n'est pas requis, mais si un utilisateur insère un espace, la validation devrait échouer.

J'ai ajouté:

class Message(models.Model): 
    msg = models.CharField(max_length = 150, blank = False) 

mais il ne fonctionne pas. Quelle est l'erreur?

+0

Blanc signifierait une chaîne vide (par opposition à une valeur nulle) - une chaîne avec des espaces n'est pas vide. Si vous voulez empêcher un champ d'avoir seulement des espaces, je pense que vous devrez écrire vos propres méthodes * clean * personnalisées. –

Répondre

12

Whitespace n'est pas considéré comme blanc. blanc fait spécifiquement référence à aucune entrée (c'est-à-dire une chaîne vide ''). Vous devrez utiliser un validateur de champ de modèle qui déclenche une exception si la valeur ne contient que des espaces. Voir the documentation pour plus de détails.

Exemple:

def validate_not_spaces(value): 
    if isinstance(value, str) and value.strip() == '': 
     raise ValidationError(u"You must provide more than just whitespace.") 

class Message(models.Model): 
    msg = models.CharField(max_length=150, blank=False, 
          validators=[validate_not_spaces]) 
+0

Ma modification a été rejetée, mais vous devez implémenter une vérification de 'isinstance (value, str)' en plus de 'value.strip() == ''' car votre fonction d'origine se casse si la valeur du champ qu'elle vérifie est 'None 'type (vous ne pouvez pas appeler' .strip() 'dessus). – py4on

+0

pas de problème - j'ai implémenté ça l'autre jour, c'est la seule raison pour laquelle je l'ai attrapé. Pendant que nous y sommes, toute raison de ne pas faire 'not value.strip()' au lieu de 'value.strip() == '''? – py4on

1

Vous devez créer votre propre formulaire et effectuer la validation personnalisée sur le terrain pour faire en sorte que les espaces répétés sont élevés comme une erreur de validation. Quelque chose comme ceci:

import re 

class MessageForm(form.ModelForm) 
    def clean_msg(self): 
     msg = self.cleaned_data['msg'] 
     if re.match('/[\s]+$',msg): 
      raise ValidationError("Spaces not allowed") 
     return msg 
Questions connexes