瀏覽代碼

Fixed #30596 -- Fixed SplitArrayField.has_changed() for non-string base fields.

Thanks to Evgeniy Krysanov for the report and the idea to use to_python.
Thanks to Mariusz Felisiak for the test case.
Chason Chaffin 5 年之前
父節點
當前提交
c238e65e29
共有 2 個文件被更改,包括 16 次插入0 次删除
  1. 4 0
      django/contrib/postgres/forms/array.py
  2. 12 0
      tests/postgres_tests/test_array.py

+ 4 - 0
django/contrib/postgres/forms/array.py

@@ -178,6 +178,10 @@ class SplitArrayField(forms.Field):
         kwargs.setdefault('widget', widget)
         super().__init__(**kwargs)
 
+    def to_python(self, value):
+        value = super().to_python(value)
+        return [self.base_field.to_python(item) for item in value]
+
     def clean(self, value):
         cleaned_data = []
         errors = []

+ 12 - 0
tests/postgres_tests/test_array.py

@@ -909,6 +909,18 @@ class TestSplitFormField(PostgreSQLSimpleTestCase):
         obj = form.save(commit=False)
         self.assertEqual(obj.field, [1, 2])
 
+    def test_splitarrayfield_has_changed(self):
+        class Form(forms.ModelForm):
+            field = SplitArrayField(forms.IntegerField(), required=False, size=2)
+
+            class Meta:
+                model = IntegerArrayModel
+                fields = ('field',)
+
+        obj = IntegerArrayModel(field=[1, 2])
+        form = Form({'field_0': '1', 'field_1': '2'}, instance=obj)
+        self.assertFalse(form.has_changed())
+
 
 class TestSplitFormWidget(PostgreSQLWidgetTestCase):