2013-07-27 9 views
5

Secondo https://docs.djangoproject.com/en/dev/ref/forms/validation/Django ValidationError

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

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

La documentazione realmente non spiegare perché è cattivo/buono. Qualcuno può dare un esempio concreto?

Inoltre, quando ispeziono form.errors, ottengo qualcosa come 'Invalid: %(value)s'. Come ottengo i parametri dall'errore di convalida e li interpola nel messaggio di errore?

A cura

Quindi questo è considerato buono?

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

Credo che la vera domanda è: perché passare le variabili separatamente tramite l'argomento params? Perché non interpolare direttamente nel messaggio di errore (ignora l'interpolazione denominata o posizionale per ora) ???

cura

Ok, dalla sorgente @https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py Io non credo che ci sia alcun modo per recuperare params di ValidationError in quanto il modulo non non anche salvare l'oggetto ValidationError stesso. Vedi il codice qui sotto.

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] 

risposta

2

Se si dispone di più parametri, potrebbero apparire in un ordine diverso quando si traduce il messaggio di errore.

Gli argomenti con nome consentono di modificare l'ordine di visualizzazione degli argomenti senza modificare params. Con una tupla di argomenti, l'ordine è fisso.

Nota che stai collegando la versione di sviluppo dei documenti Django. L'errore di convalida non interpola i parametri perché stai utilizzando Django 1.5 o versioni precedenti. Se provi il tuo codice nella versione 1.6 beta, i parametri vengono interpolati nel messaggio di errore.

+0

allora la mia domanda è perché non utilizzare 'ValidationError ( _ ('Valore non valido:% (valore) s')% { 'valore ':' 42 '}, ) ' – Lucas

+0

pls vedere la mia modifica sopra – Lucas

+0

Se si forzano le variabili direttamente nel messaggio, è più difficile sovrascrivere. Ad esempio, non si è in grado di utilizzare i segnaposto quando si utilizza l'argomento ['error_messages'] (https://docs.djangoproject.com/en/1.5/ref/forms/fields/#error-messages). – Alasdair

2

ValidationError viene catturato dalla routine di convalida del modulo e sebbene possa mostrare solo un messaggio, è meglio salvare la possibilità di ottenere params di errore; per esempio. nome del campo, valore che ha causato un errore e così via. È dichiarato poco prima dell'esempio che hai fornito.

Al fine di rendere i messaggi di errore flessibile e facile da ignorare

+0

pls vedere la mia modifica sopra – Lucas

Problemi correlati