2013-07-27 16 views
5

Nach https://docs.djangoproject.com/en/dev/ref/forms/validation/Django Validation

# Good 
    ValidationError(
     _('Invalid value: %(value)s'), 
     params={'value': '42'}, 
    ) 

    # Bad 
    ValidationError(_('Invalid value: %s') % value) 

Die docs wirklich tut erklären, warum es schlecht/gut. Kann jemand ein konkretes Beispiel geben? Wenn ich form.errors inspiziere, bekomme ich etwas wie 'Invalid: %(value)s'. Wie bekomme ich die Parameter vom Validierungsfehler und interpoliere sie in den Fehler msg?

Herausgegeben

Das ist also als gut?

ValidationError(
     _('Invalid value: %(value)s') % {'value': '42'}, 
    ) 

Ich denke, die Frage ist: warum die Variablen separat über das params Argument übergeben? Warum interpoliere nicht direkt in den Fehler msg (ignoriere named oder positional interpolation für jetzt) ​​???

Edited

Ok, Von der Quelle @https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py Ich glaube nicht, dass es einen Weg gibt, Validation des params abzurufen, da die Form nicht nicht auch die Validation speichern Objekt selbst. Siehe Code unten.

class ValidationError(Exception): 
    """An error while validating data.""" 
    def __init__(self, message, code=None, params=None): 
     import operator 
     from django.utils.encoding import force_text 
     """ 
     ValidationError can be passed any object that can be printed (usually 
     a string), a list of objects or a dictionary. 
     """ 
     if isinstance(message, dict): 
      self.message_dict = message 
      # Reduce each list of messages into a single list. 
      message = reduce(operator.add, message.values()) 

     if isinstance(message, list): 
      self.messages = [force_text(msg) for msg in message] 
     else: 
      self.code = code 
      self.params = params 
      message = force_text(message) 
      self.messages = [message] 

class Form: 
    .... 
    def _clean_fields(...): 
     .... 
     except ValidationError as e: 
      self._errors[name] = self.error_class(e.messages) # Save messages ONLY 
      if name in self.cleaned_data: 
       del self.cleaned_data[name] 

Antwort

2

Wenn Sie mehrere Parameter haben, könnten sie in einer anderen Reihenfolge angezeigt werden, wenn Sie die Fehlermeldung übersetzen.

Mit benannten Argumenten können Sie die Reihenfolge ändern, in der die Argumente angezeigt werden, ohne params zu ändern. Mit einem Tupel von Argumenten ist die Reihenfolge festgelegt.

Beachten Sie, dass Sie eine Verknüpfung mit der Entwicklungsversion der Django-Dokumentation herstellen. Der Validierungsfehler interpoliert die Parameter nicht, weil Sie Django 1.5 oder früher verwenden. Wenn Sie Ihren Code in der 1.6 Beta testen, werden die Parameter in die Fehlermeldung interpoliert.

+0

dann meine Frage ist, warum nicht verwenden 'Validation ( _ (um 'Ungültiger Wert:% (Wert) s')% { 'value ':' 42 '}, ) ' – Lucas

+0

pls siehe meine Bearbeitung oben – Lucas

+0

Wenn Sie Variablen direkt in die Nachricht einbeziehen, ist es schwerer zu überschreiben. Beispielsweise können Sie Platzhalter nicht verwenden, wenn Sie das Argument ['error_messages'] (https://docs.djangoproject.com/en/1.5/ref/forms/fields/#error-messages) verwenden. – Alasdair

2

ValidationError wird von der Formularvalidierungsroutine abgefangen und obwohl es nur eine Nachricht anzeigen kann, ist es besser, die Möglichkeit zu speichern, params des Fehlers zu erhalten; z.B. Feldname, Wert, der Fehler verursacht hat und so weiter. Es wird kurz vor dem von Ihnen angegebenen Beispiel angegeben.

Um Fehlermeldungen flexibel und einfach außer Kraft zu setzen

+0

pls siehe meine Bearbeitung oben – Lucas