summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/forms/fields.py2
-rw-r--r--tests/forms_tests/field_tests/test_jsonfield.py15
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('[&quot;foo&quot;]</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