diff options
| author | Dan Strokirk <dan.strokirk@gmail.com> | 2021-06-24 17:15:25 +0200 |
|---|---|---|
| committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2021-06-28 11:02:08 +0200 |
| commit | f5ea9aa2f32c7ca9a1fdf793580fddba3daae1b9 (patch) | |
| tree | 663ceceac46833d77dd678d5eba50e95ebdb5679 | |
| parent | 66af94d56ea08ccf8d906708a6cc002dd3ab24d3 (diff) | |
Fixed #32807 -- Fixed JSONField crash when redisplaying None values.
Thanks to Alex Hill for the initial patch.
| -rw-r--r-- | django/forms/fields.py | 2 | ||||
| -rw-r--r-- | tests/forms_tests/field_tests/test_jsonfield.py | 15 |
2 files changed, 17 insertions, 0 deletions
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"]</textarea>', 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</textarea>', 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 |
