2017-11-30 2 views
0

Weiß jemand, ob es möglich ist, mehrere Validatoren auf ein Django 1.11 Model CharField anzuwenden? Ich versuche, die Formatierung des Feldes zu erzwingen entweder als: „Use Format XX XXXX XXXX“ oder „Use Format XXXX XXX XXX“Mehrere Validatoren für Django 1.11 Modell CharField

prefphone = models.CharField(max_length=255,null=True,blank=True,validators=[RegexValidator(r'^[0-9]{2} [0-9]{4} [0-9]{4}$', "Use format XX XXXX XXXX"),RegexValidator(r'^[0-9]{4} [0-9]{3} [0-9]{3}$', "Use format XXXX XXX XXX")]) 

Die erste Validierung fehlschlägt und die zweite Validierung nicht getestet.

Wenn es alternative Methoden gibt, um mein Ergebnis zu erreichen, wäre ich dankbar, sie zu hören. Vielen Dank!

Antwort

1

Hier ist meine für mehrere Validierer nähern: eine Funktion benutzerdefinierten Validator definieren:

from django.core.exceptions import ValidationError 

validator_fn = [ 
    RegexValidator(r'^[0-9]{2} [0-9]{4} [0-9]{4}$', "Use format XX XXXX XXXX"), 
    RegexValidator(r'^[0-9]{4} [0-9]{3} [0-9]{3}$', "Use format XXXX XXX XXX") 
] 

def regex_validators(value): 
    err = None 
    for validator in validator_fn: 
     try: 
      validator(value) 
      # Valid value, return it 
      return value 
     except ValidationError as exc: 
      err = exc 
    # Value match nothing, raise error 
    raise err 

Jetzt im Feld, verwenden nur regex_validators als eine einzige Validator:

prefphone = models.CharField(max_length=255,null=True,blank=True,validators=[regex_validators,]) 
+0

Perfekt. Funktioniert gut. Das ist eine großartige Lösung. Ich schätze deine Einsicht. – cr1

0

Wenn Sie die beiden Validierungen müssen zu erfüllen

def regex_validators(value): 

    err = None 
    cont = 0 

    for validator in validator_fn: 
     try: 
      validator(value) 
      cont+=1 
      if cont == 2: 
       return value 

     except ValidationError as exc: 
      err = exc 

    raise err