Fixed #24818 -- Prevented models.CharField from accepting a string as max_length

This commit is contained in:
Alasdair Nicol 2015-05-19 10:43:06 +01:00 committed by Tim Graham
parent ae1efb853c
commit d091b75eef
2 changed files with 18 additions and 6 deletions

View File

@ -1069,11 +1069,7 @@ class CharField(Field):
return errors return errors
def _check_max_length_attribute(self, **kwargs): def _check_max_length_attribute(self, **kwargs):
try: if self.max_length is None:
max_length = int(self.max_length)
if max_length <= 0:
raise ValueError()
except TypeError:
return [ return [
checks.Error( checks.Error(
"CharFields must define a 'max_length' attribute.", "CharFields must define a 'max_length' attribute.",
@ -1082,7 +1078,7 @@ class CharField(Field):
id='fields.E120', id='fields.E120',
) )
] ]
except ValueError: elif not isinstance(self.max_length, six.integer_types) or self.max_length <= 0:
return [ return [
checks.Error( checks.Error(
"'max_length' must be a positive integer.", "'max_length' must be a positive integer.",

View File

@ -129,6 +129,22 @@ class CharFieldTests(IsolatedModelsTestCase):
] ]
self.assertEqual(errors, expected) 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): def test_non_iterable_choices(self):
class Model(models.Model): class Model(models.Model):
field = models.CharField(max_length=10, choices='bad') field = models.CharField(max_length=10, choices='bad')