mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-10-31 16:07:38 +03:00 
			
		
		
		
	Fix parsing multipart data using a nested serializer with list (#3820)
It is possible that a key in a MultiValueDict has multiple values, lists are represented this way. When accessing a key in a MultiValueDict it only returns the last element of that key. This becomes a problem when parsing an html dict with a list inside of it. To fix this problem we have to get and set the value using .getlist() and .setlist().
This commit is contained in:
		
							parent
							
								
									bc3485ab7d
								
							
						
					
					
						commit
						fdde44d9d1
					
				|  | @ -80,10 +80,12 @@ def parse_html_dict(dictionary, prefix=''): | ||||||
|     """ |     """ | ||||||
|     ret = MultiValueDict() |     ret = MultiValueDict() | ||||||
|     regex = re.compile(r'^%s\.(.+)$' % re.escape(prefix)) |     regex = re.compile(r'^%s\.(.+)$' % re.escape(prefix)) | ||||||
|     for field, value in dictionary.items(): |     for field in dictionary: | ||||||
|         match = regex.match(field) |         match = regex.match(field) | ||||||
|         if not match: |         if not match: | ||||||
|             continue |             continue | ||||||
|         key = match.groups()[0] |         key = match.groups()[0] | ||||||
|         ret[key] = value |         value = dictionary.getlist(field) | ||||||
|  |         ret.setlist(key, value) | ||||||
|  | 
 | ||||||
|     return ret |     return ret | ||||||
|  |  | ||||||
|  | @ -167,3 +167,32 @@ class TestNestedSerializerWithMany: | ||||||
| 
 | 
 | ||||||
|         expected_errors = {'not_allow_empty': {'non_field_errors': [serializers.ListSerializer.default_error_messages['empty']]}} |         expected_errors = {'not_allow_empty': {'non_field_errors': [serializers.ListSerializer.default_error_messages['empty']]}} | ||||||
|         assert serializer.errors == expected_errors |         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]) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user