summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlasdair Nicol <alasdair@thenicols.net>2015-05-19 10:43:06 +0100
committerTim Graham <timograham@gmail.com>2015-05-19 08:06:39 -0400
commitd091b75eefcd02872f7d45e9f5f5dd2fa719bbff (patch)
tree1988f9083c7e3abfa5357b0c493e82ac875a76cb
parentae1efb853c159ae4747d105405694245f8508b4b (diff)
Fixed #24818 -- Prevented models.CharField from accepting a string as max_length
-rw-r--r--django/db/models/fields/__init__.py8
-rw-r--r--tests/invalid_models_tests/test_ordinary_fields.py16
2 files changed, 18 insertions, 6 deletions
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py
index f9ae55f844..3351b4ad35 100644
--- a/django/db/models/fields/__init__.py
+++ b/django/db/models/fields/__init__.py
@@ -1069,11 +1069,7 @@ class CharField(Field):
return errors
def _check_max_length_attribute(self, **kwargs):
- try:
- max_length = int(self.max_length)
- if max_length <= 0:
- raise ValueError()
- except TypeError:
+ if self.max_length is None:
return [
checks.Error(
"CharFields must define a 'max_length' attribute.",
@@ -1082,7 +1078,7 @@ class CharField(Field):
id='fields.E120',
)
]
- except ValueError:
+ elif not isinstance(self.max_length, six.integer_types) or self.max_length <= 0:
return [
checks.Error(
"'max_length' must be a positive integer.",
diff --git a/tests/invalid_models_tests/test_ordinary_fields.py b/tests/invalid_models_tests/test_ordinary_fields.py
index c98d218b09..9baaf70feb 100644
--- a/tests/invalid_models_tests/test_ordinary_fields.py
+++ b/tests/invalid_models_tests/test_ordinary_fields.py
@@ -129,6 +129,22 @@ class CharFieldTests(IsolatedModelsTestCase):
]
self.assertEqual(errors, expected)
+ def test_str_max_length_value(self):
+ class Model(models.Model):
+ field = models.CharField(max_length='20')
+
+ field = Model._meta.get_field('field')
+ errors = field.check()
+ expected = [
+ Error(
+ "'max_length' must be a positive integer.",
+ hint=None,
+ obj=field,
+ id='fields.E121',
+ ),
+ ]
+ self.assertEqual(errors, expected)
+
def test_non_iterable_choices(self):
class Model(models.Model):
field = models.CharField(max_length=10, choices='bad')