From 1f20cb775304ebc00ab11e41352ef2b6fe9f857f Mon Sep 17 00:00:00 2001 From: Nic Young Date: Tue, 15 Sep 2015 21:53:32 -0700 Subject: [PATCH 1/6] Remove formatted messages as parameters to field bound validators, fixes #3354 - Update tests to reflect new error messages provided by Django field parent classes --- rest_framework/fields.py | 27 +++++++++------------------ tests/test_bound_fields.py | 2 +- tests/test_generics.py | 4 ++-- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 9c1dbbf642..512a733529 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -675,11 +675,9 @@ def __init__(self, **kwargs): self.min_length = kwargs.pop('min_length', None) super(CharField, self).__init__(**kwargs) if self.max_length is not None: - message = self.error_messages['max_length'].format(max_length=self.max_length) - self.validators.append(MaxLengthValidator(self.max_length, message=message)) + self.validators.append(MaxLengthValidator(self.max_length)) if self.min_length is not None: - message = self.error_messages['min_length'].format(min_length=self.min_length) - self.validators.append(MinLengthValidator(self.min_length, message=message)) + self.validators.append(MinLengthValidator(self.min_length)) def run_validation(self, data=empty): # Test for the empty string here so that it does not get validated, @@ -820,11 +818,9 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(IntegerField, self).__init__(**kwargs) if self.max_value is not None: - message = self.error_messages['max_value'].format(max_value=self.max_value) - self.validators.append(MaxValueValidator(self.max_value, message=message)) + self.validators.append(MaxValueValidator(self.max_value)) if self.min_value is not None: - message = self.error_messages['min_value'].format(min_value=self.min_value) - self.validators.append(MinValueValidator(self.min_value, message=message)) + self.validators.append(MinValueValidator(self.min_value)) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -854,11 +850,9 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(FloatField, self).__init__(**kwargs) if self.max_value is not None: - message = self.error_messages['max_value'].format(max_value=self.max_value) - self.validators.append(MaxValueValidator(self.max_value, message=message)) + self.validators.append(MaxValueValidator(self.max_value)) if self.min_value is not None: - message = self.error_messages['min_value'].format(min_value=self.min_value) - self.validators.append(MinValueValidator(self.min_value, message=message)) + self.validators.append(MinValueValidator(self.min_value)) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -903,11 +897,9 @@ def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value= super(DecimalField, self).__init__(**kwargs) if self.max_value is not None: - message = self.error_messages['max_value'].format(max_value=self.max_value) - self.validators.append(MaxValueValidator(self.max_value, message=message)) + self.validators.append(MaxValueValidator(self.max_value)) if self.min_value is not None: - message = self.error_messages['min_value'].format(min_value=self.min_value) - self.validators.append(MinValueValidator(self.min_value, message=message)) + self.validators.append(MinValueValidator(self.min_value)) def to_internal_value(self, data): """ @@ -1606,8 +1598,7 @@ def __init__(self, model_field, **kwargs): max_length = kwargs.pop('max_length', None) super(ModelField, self).__init__(**kwargs) if max_length is not None: - message = self.error_messages['max_length'].format(max_length=max_length) - self.validators.append(MaxLengthValidator(max_length, message=message)) + self.validators.append(MaxLengthValidator(max_length)) def to_internal_value(self, data): rel = getattr(self.model_field, 'rel', None) diff --git a/tests/test_bound_fields.py b/tests/test_bound_fields.py index bfc54b2339..cd02771238 100644 --- a/tests/test_bound_fields.py +++ b/tests/test_bound_fields.py @@ -39,7 +39,7 @@ class ExampleSerializer(serializers.Serializer): serializer.is_valid() assert serializer['text'].value == 'x' * 1000 - assert serializer['text'].errors == ['Ensure this field has no more than 100 characters.'] + assert serializer['text'].errors == ['Ensure this value has at most 100 characters (it has 1000).'] assert serializer['text'].name == 'text' assert serializer['amount'].value is 123 assert serializer['amount'].errors is None diff --git a/tests/test_generics.py b/tests/test_generics.py index 000adffa74..a061c27dfd 100644 --- a/tests/test_generics.py +++ b/tests/test_generics.py @@ -154,7 +154,7 @@ def test_post_error_root_view(self): data = {'text': 'foobar' * 100} request = factory.post('/', data, HTTP_ACCEPT='text/html') response = self.view(request).render() - expected_error = 'Ensure this field has no more than 100 characters.' + expected_error = 'Ensure this value has at most 100 characters (it has 600).' self.assertIn(expected_error, response.rendered_content.decode('utf-8')) @@ -301,7 +301,7 @@ def test_put_error_instance_view(self): data = {'text': 'foobar' * 100} request = factory.put('/', data, HTTP_ACCEPT='text/html') response = self.view(request, pk=1).render() - expected_error = 'Ensure this field has no more than 100 characters.' + expected_error = 'Ensure this value has at most 100 characters (it has 600).' self.assertIn(expected_error, response.rendered_content.decode('utf-8')) From 87aff642fb144642be7434f857eaf396fb40b96e Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 23 Sep 2015 17:53:52 +0200 Subject: [PATCH 2/6] Revert error messages. --- tests/test_bound_fields.py | 2 +- tests/test_generics.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_bound_fields.py b/tests/test_bound_fields.py index cd02771238..bfc54b2339 100644 --- a/tests/test_bound_fields.py +++ b/tests/test_bound_fields.py @@ -39,7 +39,7 @@ class ExampleSerializer(serializers.Serializer): serializer.is_valid() assert serializer['text'].value == 'x' * 1000 - assert serializer['text'].errors == ['Ensure this value has at most 100 characters (it has 1000).'] + assert serializer['text'].errors == ['Ensure this field has no more than 100 characters.'] assert serializer['text'].name == 'text' assert serializer['amount'].value is 123 assert serializer['amount'].errors is None diff --git a/tests/test_generics.py b/tests/test_generics.py index a061c27dfd..000adffa74 100644 --- a/tests/test_generics.py +++ b/tests/test_generics.py @@ -154,7 +154,7 @@ def test_post_error_root_view(self): data = {'text': 'foobar' * 100} request = factory.post('/', data, HTTP_ACCEPT='text/html') response = self.view(request).render() - expected_error = 'Ensure this value has at most 100 characters (it has 600).' + expected_error = 'Ensure this field has no more than 100 characters.' self.assertIn(expected_error, response.rendered_content.decode('utf-8')) @@ -301,7 +301,7 @@ def test_put_error_instance_view(self): data = {'text': 'foobar' * 100} request = factory.put('/', data, HTTP_ACCEPT='text/html') response = self.view(request, pk=1).render() - expected_error = 'Ensure this value has at most 100 characters (it has 600).' + expected_error = 'Ensure this field has no more than 100 characters.' self.assertIn(expected_error, response.rendered_content.decode('utf-8')) From 6007bc7d9d6e4b7510927d87c07969ee62e99567 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 23 Sep 2015 17:55:56 +0200 Subject: [PATCH 3/6] Min/MaxValue/LengthValidator now defer the message formatting and able to handle new string format. --- rest_framework/compat.py | 56 ++++++++++++++++++++++------------------ rest_framework/fields.py | 27 ++++++++++++------- 2 files changed, 49 insertions(+), 34 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 460795f658..121b32fb90 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -11,6 +11,8 @@ from django.db import connection, transaction from django.utils import six from django.views.generic import View +from django.core.exceptions import ValidationError + try: import importlib # Available in Python 3.1+ @@ -109,39 +111,43 @@ def get_model_name(model_cls): return model_cls._meta.module_name -# MinValueValidator, MaxValueValidator et al. only accept `message` in 1.8+ -if django.VERSION >= (1, 8): - from django.core.validators import MinValueValidator, MaxValueValidator - from django.core.validators import MinLengthValidator, MaxLengthValidator -else: - from django.core.validators import MinValueValidator as DjangoMinValueValidator - from django.core.validators import MaxValueValidator as DjangoMaxValueValidator - from django.core.validators import MinLengthValidator as DjangoMinLengthValidator - from django.core.validators import MaxLengthValidator as DjangoMaxLengthValidator +from django.core.validators import MinValueValidator +from django.core.validators import MaxValueValidator +from django.core.validators import MinLengthValidator +from django.core.validators import MaxLengthValidator - class MinValueValidator(DjangoMinValueValidator): - def __init__(self, *args, **kwargs): - self.message = kwargs.pop('message', self.message) - super(MinValueValidator, self).__init__(*args, **kwargs) +class CustomValidatorMessage(object): + def __init__(self, *args, **kwargs): + self.message = kwargs.pop('message', self.message) + self.format = kwargs.pop('string_format', '%') + 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 MaxValueValidator(DjangoMaxValueValidator): - def __init__(self, *args, **kwargs): - self.message = kwargs.pop('message', self.message) - super(MaxValueValidator, self).__init__(*args, **kwargs) +class MinValueValidator(CustomValidatorMessage, MinValueValidator): + pass - class MinLengthValidator(DjangoMinLengthValidator): - def __init__(self, *args, **kwargs): - self.message = kwargs.pop('message', self.message) - super(MinLengthValidator, self).__init__(*args, **kwargs) +class MaxValueValidator(CustomValidatorMessage, MaxValueValidator): + pass - class MaxLengthValidator(DjangoMaxLengthValidator): - def __init__(self, *args, **kwargs): - self.message = kwargs.pop('message', self.message) - super(MaxLengthValidator, self).__init__(*args, **kwargs) + +class MinLengthValidator(CustomValidatorMessage, MinLengthValidator): + pass + + +class MaxLengthValidator(CustomValidatorMessage, MaxLengthValidator): + pass # URLValidator only accepts `message` in 1.6+ diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 512a733529..5ecc504237 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -675,9 +675,11 @@ def __init__(self, **kwargs): self.min_length = kwargs.pop('min_length', None) super(CharField, self).__init__(**kwargs) if self.max_length is not None: - self.validators.append(MaxLengthValidator(self.max_length)) + message = self.error_messages['max_length'] + self.validators.append(MaxLengthValidator(self.max_length, message=message, string_format='{')) if self.min_length is not None: - self.validators.append(MinLengthValidator(self.min_length)) + message = self.error_messages['min_length'] + self.validators.append(MinLengthValidator(self.min_length, message=message, string_format='{')) def run_validation(self, data=empty): # Test for the empty string here so that it does not get validated, @@ -818,9 +820,11 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(IntegerField, self).__init__(**kwargs) if self.max_value is not None: - self.validators.append(MaxValueValidator(self.max_value)) + message = self.error_messages['max_value'] + self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{')) if self.min_value is not None: - self.validators.append(MinValueValidator(self.min_value)) + message = self.error_messages['min_value'] + self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{')) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -850,9 +854,11 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(FloatField, self).__init__(**kwargs) if self.max_value is not None: - self.validators.append(MaxValueValidator(self.max_value)) + message = self.error_messages['max_value'] + self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{')) if self.min_value is not None: - self.validators.append(MinValueValidator(self.min_value)) + message = self.error_messages['min_value'] + self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{')) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -897,9 +903,11 @@ def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value= super(DecimalField, self).__init__(**kwargs) if self.max_value is not None: - self.validators.append(MaxValueValidator(self.max_value)) + message = self.error_messages['max_value'] + self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{')) if self.min_value is not None: - self.validators.append(MinValueValidator(self.min_value)) + message = self.error_messages['min_value'] + self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{')) def to_internal_value(self, data): """ @@ -1598,7 +1606,8 @@ def __init__(self, model_field, **kwargs): max_length = kwargs.pop('max_length', None) super(ModelField, self).__init__(**kwargs) if max_length is not None: - self.validators.append(MaxLengthValidator(max_length)) + message = self.error_messages['max_length'] + self.validators.append(MaxLengthValidator(max_length, message=message, string_format='{')) def to_internal_value(self, data): rel = getattr(self.model_field, 'rel', None) From 1ce88beff04138b1e8635e0914ca4cb9922184b4 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 23 Sep 2015 18:14:36 +0200 Subject: [PATCH 4/6] Fix import order. --- rest_framework/compat.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 121b32fb90..a55a9e0953 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -8,11 +8,14 @@ import django from django.conf import settings +from django.core.exceptions import ValidationError +from django.core.validators import ( + MaxLengthValidator, MaxValueValidator, MinLengthValidator, + MinValueValidator +) from django.db import connection, transaction from django.utils import six from django.views.generic import View -from django.core.exceptions import ValidationError - try: import importlib # Available in Python 3.1+ @@ -111,10 +114,6 @@ def get_model_name(model_cls): return model_cls._meta.module_name -from django.core.validators import MinValueValidator -from django.core.validators import MaxValueValidator -from django.core.validators import MinLengthValidator -from django.core.validators import MaxLengthValidator class CustomValidatorMessage(object): From 3a4be046bd85d96f8525d1de5551595a55a939cd Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Mon, 19 Oct 2015 22:42:52 +0200 Subject: [PATCH 5/6] Refactor the message generation to delay the formatting. --- rest_framework/compat.py | 13 ------------- rest_framework/fields.py | 38 +++++++++++++++++++------------------- 2 files changed, 19 insertions(+), 32 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index a55a9e0953..8d80f066d8 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -114,24 +114,11 @@ def get_model_name(model_cls): return model_cls._meta.module_name - - class CustomValidatorMessage(object): def __init__(self, *args, **kwargs): self.message = kwargs.pop('message', self.message) - self.format = kwargs.pop('string_format', '%') 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): pass diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 5ecc504237..240d32cb07 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -17,7 +17,7 @@ from django.utils import six, timezone from django.utils.dateparse import parse_date, parse_datetime, parse_time 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.translation import ugettext_lazy as _ @@ -675,11 +675,11 @@ def __init__(self, **kwargs): self.min_length = kwargs.pop('min_length', None) super(CharField, self).__init__(**kwargs) if self.max_length is not None: - message = self.error_messages['max_length'] - self.validators.append(MaxLengthValidator(self.max_length, message=message, string_format='{')) + message = lazy(self.error_messages['max_length'].format, str)(max_length=self.max_length) + self.validators.append(MaxLengthValidator(self.max_length, message=message)) if self.min_length is not None: - message = self.error_messages['min_length'] - self.validators.append(MinLengthValidator(self.min_length, message=message, string_format='{')) + message = lazy(self.error_messages['min_length'].format, str)(min_length=self.min_length) + self.validators.append(MinLengthValidator(self.min_length, message=message)) def run_validation(self, data=empty): # Test for the empty string here so that it does not get validated, @@ -820,11 +820,11 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(IntegerField, self).__init__(**kwargs) if self.max_value is not None: - message = self.error_messages['max_value'] - self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{')) + message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value) + self.validators.append(MaxValueValidator(self.max_value, message=message)) if self.min_value is not None: - message = self.error_messages['min_value'] - self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{')) + message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value) + self.validators.append(MinValueValidator(self.min_value, message=message)) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -854,11 +854,11 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(FloatField, self).__init__(**kwargs) if self.max_value is not None: - message = self.error_messages['max_value'] - self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{')) + message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value) + self.validators.append(MaxValueValidator(self.max_value, message=message)) if self.min_value is not None: - message = self.error_messages['min_value'] - self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{')) + message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value) + self.validators.append(MinValueValidator(self.min_value, message=message)) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -903,11 +903,11 @@ def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value= super(DecimalField, self).__init__(**kwargs) if self.max_value is not None: - message = self.error_messages['max_value'] - self.validators.append(MaxValueValidator(self.max_value, message=message, string_format='{')) + message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value) + self.validators.append(MaxValueValidator(self.max_value, message=message)) if self.min_value is not None: - message = self.error_messages['min_value'] - self.validators.append(MinValueValidator(self.min_value, message=message, string_format='{')) + message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value) + self.validators.append(MinValueValidator(self.min_value, message=message)) def to_internal_value(self, data): """ @@ -1606,8 +1606,8 @@ def __init__(self, model_field, **kwargs): max_length = kwargs.pop('max_length', None) super(ModelField, self).__init__(**kwargs) if max_length is not None: - message = self.error_messages['max_length'] - self.validators.append(MaxLengthValidator(max_length, message=message, string_format='{')) + message = lazy(self.error_messages['max_length'].format, str)(max_length=max_length) + self.validators.append(MaxLengthValidator(max_length, message=message)) def to_internal_value(self, data): rel = getattr(self.model_field, 'rel', None) From fd34388681ace998e1c875865d8385e661268a43 Mon Sep 17 00:00:00 2001 From: Xavier Ordoquy Date: Wed, 25 Nov 2015 07:42:51 +0100 Subject: [PATCH 6/6] Use six.text_type instead of str. --- rest_framework/fields.py | 63 ++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 18 deletions(-) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 591f126b92..55e56ce398 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -679,11 +679,17 @@ def __init__(self, **kwargs): self.min_length = kwargs.pop('min_length', None) super(CharField, self).__init__(**kwargs) if self.max_length is not None: - message = lazy(self.error_messages['max_length'].format, str)(max_length=self.max_length) - self.validators.append(MaxLengthValidator(self.max_length, message=message)) + message = lazy( + self.error_messages['max_length'].format, + six.text_type)(max_length=self.max_length) + self.validators.append( + MaxLengthValidator(self.max_length, message=message)) if self.min_length is not None: - message = lazy(self.error_messages['min_length'].format, str)(min_length=self.min_length) - self.validators.append(MinLengthValidator(self.min_length, message=message)) + message = lazy( + self.error_messages['min_length'].format, + six.text_type)(min_length=self.min_length) + self.validators.append( + MinLengthValidator(self.min_length, message=message)) def run_validation(self, data=empty): # Test for the empty string here so that it does not get validated, @@ -824,11 +830,17 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(IntegerField, self).__init__(**kwargs) if self.max_value is not None: - message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value) - self.validators.append(MaxValueValidator(self.max_value, message=message)) + message = lazy( + self.error_messages['max_value'].format, + six.text_type)(max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) if self.min_value is not None: - message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value) - self.validators.append(MinValueValidator(self.min_value, message=message)) + message = lazy( + self.error_messages['min_value'].format, + six.text_type)(min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -858,11 +870,17 @@ def __init__(self, **kwargs): self.min_value = kwargs.pop('min_value', None) super(FloatField, self).__init__(**kwargs) if self.max_value is not None: - message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value) - self.validators.append(MaxValueValidator(self.max_value, message=message)) + message = lazy( + self.error_messages['max_value'].format, + six.text_type)(max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) if self.min_value is not None: - message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value) - self.validators.append(MinValueValidator(self.min_value, message=message)) + message = lazy( + self.error_messages['min_value'].format, + six.text_type)(min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) def to_internal_value(self, data): if isinstance(data, six.text_type) and len(data) > self.MAX_STRING_LENGTH: @@ -906,11 +924,17 @@ def __init__(self, max_digits, decimal_places, coerce_to_string=None, max_value= super(DecimalField, self).__init__(**kwargs) if self.max_value is not None: - message = lazy(self.error_messages['max_value'].format, str)(max_value=self.max_value) - self.validators.append(MaxValueValidator(self.max_value, message=message)) + message = lazy( + self.error_messages['max_value'].format, + six.text_type)(max_value=self.max_value) + self.validators.append( + MaxValueValidator(self.max_value, message=message)) if self.min_value is not None: - message = lazy(self.error_messages['min_value'].format, str)(min_value=self.min_value) - self.validators.append(MinValueValidator(self.min_value, message=message)) + message = lazy( + self.error_messages['min_value'].format, + six.text_type)(min_value=self.min_value) + self.validators.append( + MinValueValidator(self.min_value, message=message)) def to_internal_value(self, data): """ @@ -1661,8 +1685,11 @@ def __init__(self, model_field, **kwargs): max_length = kwargs.pop('max_length', None) super(ModelField, self).__init__(**kwargs) if max_length is not None: - message = lazy(self.error_messages['max_length'].format, str)(max_length=max_length) - self.validators.append(MaxLengthValidator(max_length, message=message)) + message = lazy( + self.error_messages['max_length'].format, + six.text_type)(max_length=max_length) + self.validators.append( + MaxLengthValidator(max_length, message=message)) def to_internal_value(self, data): rel = getattr(self.model_field, 'rel', None) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy