diff --git a/django/forms/fields.py b/django/forms/fields.py index 57886656de..f1275aa387 100644 --- a/django/forms/fields.py +++ b/django/forms/fields.py @@ -1251,6 +1251,8 @@ class JSONField(CharField): def bound_data(self, data, initial): if self.disabled: return initial + if data is None: + return None try: return json.loads(data, cls=self.decoder) except json.JSONDecodeError: diff --git a/tests/forms_tests/field_tests/test_jsonfield.py b/tests/forms_tests/field_tests/test_jsonfield.py index 46ef0005f6..b4f3e74f6a 100644 --- a/tests/forms_tests/field_tests/test_jsonfield.py +++ b/tests/forms_tests/field_tests/test_jsonfield.py @@ -97,6 +97,21 @@ class JSONFieldTest(SimpleTestCase): form = JSONForm({'json_field': '["bar"]'}, initial={'json_field': ['foo']}) self.assertIn('["foo"]', form.as_p()) + def test_redisplay_none_input(self): + class JSONForm(Form): + json_field = JSONField(required=True) + + tests = [ + {}, + {'json_field': None}, + ] + for data in tests: + with self.subTest(data=data): + form = JSONForm(data) + self.assertEqual(form['json_field'].value(), 'null') + self.assertIn('null', form.as_p()) + self.assertEqual(form.errors['json_field'], ['This field is required.']) + def test_redisplay_wrong_input(self): """ Displaying a bound form (typically due to invalid input). The form