mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-08 14:24:48 +03:00
Refactor the message generation to delay the formatting.
This commit is contained in:
parent
1ce88beff0
commit
3a4be046bd
|
@ -114,24 +114,11 @@ def get_model_name(model_cls):
|
||||||
return model_cls._meta.module_name
|
return model_cls._meta.module_name
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class CustomValidatorMessage(object):
|
class CustomValidatorMessage(object):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
self.message = kwargs.pop('message', self.message)
|
self.message = kwargs.pop('message', self.message)
|
||||||
self.format = kwargs.pop('string_format', '%')
|
|
||||||
super(CustomValidatorMessage, self).__init__(*args, **kwargs)
|
super(CustomValidatorMessage, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
def __call__(self, value):
|
|
||||||
cleaned = self.clean(value)
|
|
||||||
params = {'limit_value': self.limit_value, 'show_value': cleaned, 'value': value}
|
|
||||||
if self.compare(cleaned, self.limit_value):
|
|
||||||
message = self.message
|
|
||||||
if self.format == '{':
|
|
||||||
args = {self.code: self.limit_value}
|
|
||||||
message = message.format(**args)
|
|
||||||
raise ValidationError(message, code=self.code, params=params)
|
|
||||||
|
|
||||||
|
|
||||||
class MinValueValidator(CustomValidatorMessage, MinValueValidator):
|
class MinValueValidator(CustomValidatorMessage, MinValueValidator):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -17,7 +17,7 @@ from django.forms import ImageField as DjangoImageField
|
||||||
from django.utils import six, timezone
|
from django.utils import six, timezone
|
||||||
from django.utils.dateparse import parse_date, parse_datetime, parse_time
|
from django.utils.dateparse import parse_date, parse_datetime, parse_time
|
||||||
from django.utils.encoding import is_protected_type, smart_text
|
from django.utils.encoding import is_protected_type, smart_text
|
||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property, lazy
|
||||||
from django.utils.ipv6 import clean_ipv6_address
|
from django.utils.ipv6 import clean_ipv6_address
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
@ -675,11 +675,11 @@ class CharField(Field):
|
||||||
self.min_length = kwargs.pop('min_length', None)
|
self.min_length = kwargs.pop('min_length', None)
|
||||||
super(CharField, self).__init__(**kwargs)
|
super(CharField, self).__init__(**kwargs)
|
||||||
if self.max_length is not None:
|
if self.max_length is not None:
|
||||||
message = self.error_messages['max_length']
|
message = lazy(self.error_messages['max_length'].format, str)(max_length=self.max_length)
|
||||||
self.validators.append(MaxLengthValidator(self.max_length, message=message, string_format='{'))
|
self.validators.append(MaxLengthValidator(self.max_length, message=message))
|
||||||
if self.min_length is not None:
|
if self.min_length is not None:
|
||||||
message = self.error_messages['min_length']
|
message = lazy(self.error_messages['min_length'].format, str)(min_length=self.min_length)
|
||||||
self.validators.append(MinLengthValidator(self.min_length, message=message, string_format='{'))
|
self.validators.append(MinLengthValidator(self.min_length, message=message))
|
||||||
|
|
||||||
def run_validation(self, data=empty):
|
def run_validation(self, data=empty):
|
||||||
# Test for the empty string here so that it does not get validated,
|
# Test for the empty string here so that it does not get validated,
|
||||||
|
@ -820,11 +820,11 @@ class IntegerField(Field):
|
||||||
self.min_value = kwargs.pop('min_value', None)
|
self.min_value = kwargs.pop('min_value', None)
|
||||||
super(IntegerField, self).__init__(**kwargs)
|
super(IntegerField, self).__init__(**kwargs)
|
||||||
if self.max_value is not None:
|
if self.max_value is not None:
|
||||||
message = self.error_messages['max_value']
|
message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value)
|
||||||
self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{'))
|
self.validators.append(MaxValueValidator(self.max_value, message=message))
|
||||||
if self.min_value is not None:
|
if self.min_value is not None:
|
||||||
message = self.error_messages['min_value']
|
message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value)
|
||||||
self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{'))
|
self.validators.append(MinValueValidator(self.min_value, message=message))
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
|
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
|
||||||
|
@ -854,11 +854,11 @@ class FloatField(Field):
|
||||||
self.min_value = kwargs.pop('min_value', None)
|
self.min_value = kwargs.pop('min_value', None)
|
||||||
super(FloatField, self).__init__(**kwargs)
|
super(FloatField, self).__init__(**kwargs)
|
||||||
if self.max_value is not None:
|
if self.max_value is not None:
|
||||||
message = self.error_messages['max_value']
|
message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value)
|
||||||
self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{'))
|
self.validators.append(MaxValueValidator(self.max_value, message=message))
|
||||||
if self.min_value is not None:
|
if self.min_value is not None:
|
||||||
message = self.error_messages['min_value']
|
message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value)
|
||||||
self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{'))
|
self.validators.append(MinValueValidator(self.min_value, message=message))
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
|
if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH:
|
||||||
|
@ -903,11 +903,11 @@ class DecimalField(Field):
|
||||||
super(DecimalField, self).__init__(**kwargs)
|
super(DecimalField, self).__init__(**kwargs)
|
||||||
|
|
||||||
if self.max_value is not None:
|
if self.max_value is not None:
|
||||||
message = self.error_messages['max_value']
|
message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value)
|
||||||
self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{'))
|
self.validators.append(MaxValueValidator(self.max_value, message=message))
|
||||||
if self.min_value is not None:
|
if self.min_value is not None:
|
||||||
message = self.error_messages['min_value']
|
message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value)
|
||||||
self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{'))
|
self.validators.append(MinValueValidator(self.min_value, message=message))
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
"""
|
"""
|
||||||
|
@ -1606,8 +1606,8 @@ class ModelField(Field):
|
||||||
max_length = kwargs.pop('max_length', None)
|
max_length = kwargs.pop('max_length', None)
|
||||||
super(ModelField, self).__init__(**kwargs)
|
super(ModelField, self).__init__(**kwargs)
|
||||||
if max_length is not None:
|
if max_length is not None:
|
||||||
message = self.error_messages['max_length']
|
message = lazy(self.error_messages['max_length'].format, str)(max_length=max_length)
|
||||||
self.validators.append(MaxLengthValidator(max_length, message=message, string_format='{'))
|
self.validators.append(MaxLengthValidator(max_length, message=message))
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
rel = getattr(self.model_field, 'rel', None)
|
rel = getattr(self.model_field, 'rel', None)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user