Według 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)
Docs nie robi naprawdę wyjaśnić, dlaczego jest źle/dobrze. Czy ktoś może podać konkretny przykład?
Ponadto, gdy sprawdzam form.errors
, otrzymuję coś w rodzaju 'Invalid: %(value)s'
. W jaki sposób uzyskać params od błędu sprawdzania poprawności i interpolować je do komunikatów o błędach?
Zmieniano
Więc to jest uważane za dobre?
ValidationError(
_('Invalid value: %(value)s') % {'value': '42'},
)
Myślę, że prawdziwe pytanie brzmi: dlaczego przekazać zmienne osobno poprzez params
argumentu? Dlaczego nie interpolować bezpośrednio do msg błędu (zignoruj na razie nazwę lub interpolację pozycyjną) ???
Edited
Ok, od źródła @https://github.com/django/django/blob/stable/1.5.x/django/forms/forms.py I nie sądzę, że istnieje jakiś sposób, aby odzyskać params ValidationError od czasu Formularz robi nie nawet uratować samego obiektu ValidationError. Zobacz kod poniżej.
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]
następnie moje pytanie brzmi: dlaczego nie użyć 'ValidationError ( _ ('Nieprawidłowa wartość:% (wartość) S')% { 'wartość ": '42'}, )' – Lucas
pls zobacz moją edycję powyżej – Lucas
Jeśli wymienisz zmienne bezpośrednio na wiadomość, trudniej jest ją przesłonić. Na przykład nie można używać symboli zastępczych podczas używania argumentu ['error_messages'] (https://docs.djangoproject.com/en/1.5/ref/forms/fields/#error-messages). – Alasdair