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]
dann meine Frage ist, warum nicht verwenden 'Validation ( _ (um 'Ungültiger Wert:% (Wert) s')% { 'value ':' 42 '}, ) ' – Lucas
pls siehe meine Bearbeitung oben – Lucas
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