Loading django/forms/fields.py +5 −0 Original line number Diff line number Diff line Loading @@ -977,6 +977,11 @@ class MultiValueField(Field): f.required = False self.fields = fields def __deepcopy__(self, memo): result = super(MultiValueField, self).__deepcopy__(memo) result.fields = tuple([x.__deepcopy__(memo) for x in self.fields]) return result def validate(self, value): pass Loading tests/forms_tests/tests/test_forms.py +21 −0 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals import copy import datetime from django.core.files.uploadedfile import SimpleUploadedFile Loading Loading @@ -1793,6 +1794,26 @@ class FormsTestCase(TestCase): self.assertTrue(form.is_valid()) self.assertEqual(form.cleaned_data, {'name' : 'fname lname'}) def test_multivalue_deep_copy(self): """ #19298 -- MultiValueField needs to override the default as it needs to deep-copy subfields: """ class ChoicesField(MultiValueField): def __init__(self, fields=(), *args, **kwargs): fields = (ChoiceField(label='Rank', choices=((1,1),(2,2))), CharField(label='Name', max_length=10)) super(ChoicesField, self).__init__(fields=fields, *args, **kwargs) field = ChoicesField() field2 = copy.deepcopy(field) self.assertTrue(isinstance(field2, ChoicesField)) self.assertFalse(id(field2.fields) == id(field.fields)) self.assertFalse(id(field2.fields[0].choices) == id(field.fields[0].choices)) def test_multivalue_optional_subfields(self): class PhoneField(MultiValueField): def __init__(self, *args, **kwargs): Loading Loading
django/forms/fields.py +5 −0 Original line number Diff line number Diff line Loading @@ -977,6 +977,11 @@ class MultiValueField(Field): f.required = False self.fields = fields def __deepcopy__(self, memo): result = super(MultiValueField, self).__deepcopy__(memo) result.fields = tuple([x.__deepcopy__(memo) for x in self.fields]) return result def validate(self, value): pass Loading
tests/forms_tests/tests/test_forms.py +21 −0 Original line number Diff line number Diff line # -*- coding: utf-8 -*- from __future__ import unicode_literals import copy import datetime from django.core.files.uploadedfile import SimpleUploadedFile Loading Loading @@ -1793,6 +1794,26 @@ class FormsTestCase(TestCase): self.assertTrue(form.is_valid()) self.assertEqual(form.cleaned_data, {'name' : 'fname lname'}) def test_multivalue_deep_copy(self): """ #19298 -- MultiValueField needs to override the default as it needs to deep-copy subfields: """ class ChoicesField(MultiValueField): def __init__(self, fields=(), *args, **kwargs): fields = (ChoiceField(label='Rank', choices=((1,1),(2,2))), CharField(label='Name', max_length=10)) super(ChoicesField, self).__init__(fields=fields, *args, **kwargs) field = ChoicesField() field2 = copy.deepcopy(field) self.assertTrue(isinstance(field2, ChoicesField)) self.assertFalse(id(field2.fields) == id(field.fields)) self.assertFalse(id(field2.fields[0].choices) == id(field.fields[0].choices)) def test_multivalue_optional_subfields(self): class PhoneField(MultiValueField): def __init__(self, *args, **kwargs): Loading