Commit d091b75e authored by Alasdair Nicol's avatar Alasdair Nicol Committed by Tim Graham
Browse files

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

parent ae1efb85
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -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.",
+16 −0
Original line number Diff line number Diff line
@@ -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')