瀏覽代碼

Fixed #32807 -- Fixed JSONField crash when redisplaying None values.

Thanks to Alex Hill for the initial patch.
Dan Strokirk 3 年之前
父節點
當前提交
f5ea9aa2f3
共有 2 個文件被更改,包括 17 次插入0 次删除
  1. 2 0
      django/forms/fields.py
  2. 15 0
      tests/forms_tests/field_tests/test_jsonfield.py

+ 2 - 0
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:

+ 15 - 0
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