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.
This commit is contained in:
Chason Chaffin 2019-07-03 18:32:43 +09:00 committed by Mariusz Felisiak
parent 54dcfbc367
commit c238e65e29
2 changed files with 16 additions and 0 deletions

View File

@ -178,6 +178,10 @@ class SplitArrayField(forms.Field):
kwargs.setdefault('widget', widget) kwargs.setdefault('widget', widget)
super().__init__(**kwargs) 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): def clean(self, value):
cleaned_data = [] cleaned_data = []
errors = [] errors = []

View File

@ -909,6 +909,18 @@ class TestSplitFormField(PostgreSQLSimpleTestCase):
obj = form.save(commit=False) obj = form.save(commit=False)
self.assertEqual(obj.field, [1, 2]) 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): class TestSplitFormWidget(PostgreSQLWidgetTestCase):