diff --git a/rest_framework/utils/html.py b/rest_framework/utils/html.py index 3b871027c..121c825c7 100644 --- a/rest_framework/utils/html.py +++ b/rest_framework/utils/html.py @@ -80,10 +80,12 @@ def parse_html_dict(dictionary, prefix=''): """ ret = MultiValueDict() regex = re.compile(r'^%s\.(.+)$' % re.escape(prefix)) - for field, value in dictionary.items(): + for field in dictionary: match = regex.match(field) if not match: continue key = match.groups()[0] - ret[key] = value + value = dictionary.getlist(field) + ret.setlist(key, value) + return ret diff --git a/tests/test_serializer_nested.py b/tests/test_serializer_nested.py index aeb092ee0..133600399 100644 --- a/tests/test_serializer_nested.py +++ b/tests/test_serializer_nested.py @@ -167,3 +167,32 @@ class TestNestedSerializerWithMany: expected_errors = {'not_allow_empty': {'non_field_errors': [serializers.ListSerializer.default_error_messages['empty']]}} assert serializer.errors == expected_errors + + +class TestNestedSerializerWithList: + def setup(self): + class NestedSerializer(serializers.Serializer): + example = serializers.MultipleChoiceField(choices=[1, 2, 3]) + + class TestSerializer(serializers.Serializer): + nested = NestedSerializer() + + self.Serializer = TestSerializer + + def test_nested_serializer_with_list_json(self): + input_data = { + 'nested': { + 'example': [1, 2], + } + } + serializer = self.Serializer(data=input_data) + + assert serializer.is_valid() + assert serializer.validated_data['nested']['example'] == set([1, 2]) + + def test_nested_serializer_with_list_multipart(self): + input_data = QueryDict('nested.example=1&nested.example=2') + serializer = self.Serializer(data=input_data) + + assert serializer.is_valid() + assert serializer.validated_data['nested']['example'] == set([1, 2])