From a452dddb253ff4fdd793351dac73eeef4d86b83e Mon Sep 17 00:00:00 2001 From: Adam Chainz Date: Sun, 5 Mar 2017 16:50:33 +0000 Subject: Fixed #27904 -- Added a system check that Field.validators are callable. --- django/db/models/fields/__init__.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'django') diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 79a983b8fa..d9e2bac348 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -204,6 +204,7 @@ class Field(RegisterLookupMixin): errors.extend(self._check_db_index()) errors.extend(self._check_null_allowed_for_primary_keys()) errors.extend(self._check_backend_specific_checks(**kwargs)) + errors.extend(self._check_validators()) errors.extend(self._check_deprecation_details()) return errors @@ -302,6 +303,25 @@ class Field(RegisterLookupMixin): return connections[db].validation.check_field(self, **kwargs) return [] + def _check_validators(self): + errors = [] + for i, validator in enumerate(self.validators): + if not callable(validator): + errors.append( + checks.Error( + "All 'validators' must be callable.", + hint=( + "validators[{i}] ({repr}) isn't a function or " + "instance of a validator class.".format( + i=i, repr=repr(validator), + ) + ), + obj=self, + id='fields.E008', + ) + ) + return errors + def _check_deprecation_details(self): if self.system_check_removed_details is not None: return [ -- cgit v1.3