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]
allora la mia domanda è perché non utilizzare 'ValidationError ( _ ('Valore non valido:% (valore) s')% { 'valore ':' 42 '}, ) ' – Lucas
pls vedere la mia modifica sopra – Lucas
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