Fixed #29860 -- Allowed BaseValidator to accept a callable limit_value.

This commit is contained in:
buzzi 2018-10-17 14:52:19 +00:00 committed by Tim Graham
parent 5e3463f6bc
commit 24cae0bedc
4 changed files with 34 additions and 7 deletions

View File

@ -317,8 +317,9 @@ class BaseValidator:
def __call__(self, value): def __call__(self, value):
cleaned = self.clean(value) cleaned = self.clean(value)
params = {'limit_value': self.limit_value, 'show_value': cleaned, 'value': value} limit_value = self.limit_value() if callable(self.limit_value) else self.limit_value
if self.compare(cleaned, self.limit_value): params = {'limit_value': limit_value, 'show_value': cleaned, 'value': value}
if self.compare(cleaned, limit_value):
raise ValidationError(self.message, code=self.code, params=params) raise ValidationError(self.message, code=self.code, params=params)
def __eq__(self, other): def __eq__(self, other):

View File

@ -236,7 +236,12 @@ to, or in lieu of custom ``field.clean()`` methods.
.. class:: MaxValueValidator(limit_value, message=None) .. class:: MaxValueValidator(limit_value, message=None)
Raises a :exc:`~django.core.exceptions.ValidationError` with a code of Raises a :exc:`~django.core.exceptions.ValidationError` with a code of
``'max_value'`` if ``value`` is greater than ``limit_value``. ``'max_value'`` if ``value`` is greater than ``limit_value``, which may be
a callable.
.. versionchanged:: 2.2
``limit_value`` can now be a callable.
``MinValueValidator`` ``MinValueValidator``
--------------------- ---------------------
@ -244,7 +249,12 @@ to, or in lieu of custom ``field.clean()`` methods.
.. class:: MinValueValidator(limit_value, message=None) .. class:: MinValueValidator(limit_value, message=None)
Raises a :exc:`~django.core.exceptions.ValidationError` with a code of Raises a :exc:`~django.core.exceptions.ValidationError` with a code of
``'min_value'`` if ``value`` is less than ``limit_value``. ``'min_value'`` if ``value`` is less than ``limit_value``, which may be a
callable.
.. versionchanged:: 2.2
``limit_value`` can now be a callable.
``MaxLengthValidator`` ``MaxLengthValidator``
---------------------- ----------------------
@ -252,7 +262,12 @@ to, or in lieu of custom ``field.clean()`` methods.
.. class:: MaxLengthValidator(limit_value, message=None) .. class:: MaxLengthValidator(limit_value, message=None)
Raises a :exc:`~django.core.exceptions.ValidationError` with a code of Raises a :exc:`~django.core.exceptions.ValidationError` with a code of
``'max_length'`` if the length of ``value`` is greater than ``limit_value``. ``'max_length'`` if the length of ``value`` is greater than
``limit_value``, which may be a callable.
.. versionchanged:: 2.2
``limit_value`` can now be a callable.
``MinLengthValidator`` ``MinLengthValidator``
---------------------- ----------------------
@ -260,7 +275,12 @@ to, or in lieu of custom ``field.clean()`` methods.
.. class:: MinLengthValidator(limit_value, message=None) .. class:: MinLengthValidator(limit_value, message=None)
Raises a :exc:`~django.core.exceptions.ValidationError` with a code of Raises a :exc:`~django.core.exceptions.ValidationError` with a code of
``'min_length'`` if the length of ``value`` is less than ``limit_value``. ``'min_length'`` if the length of ``value`` is less than ``limit_value``,
which may be a callable.
.. versionchanged:: 2.2
``limit_value`` can now be a callable.
``DecimalValidator`` ``DecimalValidator``
-------------------- --------------------

View File

@ -259,7 +259,9 @@ URLs
Validators Validators
~~~~~~~~~~ ~~~~~~~~~~
* ... * :class:`.MaxValueValidator`, :class:`.MinValueValidator`,
:class:`.MinLengthValidator`, and :class:`.MaxLengthValidator` now accept
a callable ``limit_value``.
.. _backwards-incompatible-2.2: .. _backwards-incompatible-2.2:

View File

@ -203,6 +203,10 @@ TEST_DATA = [
(MinValueValidator(0), -1, ValidationError), (MinValueValidator(0), -1, ValidationError),
(MinValueValidator(NOW), NOW - timedelta(days=1), ValidationError), (MinValueValidator(NOW), NOW - timedelta(days=1), ValidationError),
# limit_value may be a callable.
(MinValueValidator(lambda: 1), 0, ValidationError),
(MinValueValidator(lambda: 1), 1, None),
(MaxLengthValidator(10), '', None), (MaxLengthValidator(10), '', None),
(MaxLengthValidator(10), 10 * 'x', None), (MaxLengthValidator(10), 10 * 'x', None),