diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 6e1370b72..64646d58c 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -679,4 +679,12 @@ class MultiPartRenderer(BaseRenderer): BOUNDARY = 'BoUnDaRyStRiNg' if django.VERSION >= (1, 5) else b'BoUnDaRyStRiNg' def render(self, data, accepted_media_type=None, renderer_context=None): + if hasattr(data, 'items'): + for key, value in data.items(): + assert not isinstance(value, dict), ( + "Test data contained a dictionary value for key '%s', " + "but multipart uploads do not support nested data. " + "You may want to consider using format='JSON' in this " + "test case." % key + ) return encode_multipart(self.BOUNDARY, data) diff --git a/tests/test_testing.py b/tests/test_testing.py index 70c83f8d9..e0bf759a4 100644 --- a/tests/test_testing.py +++ b/tests/test_testing.py @@ -172,6 +172,16 @@ class TestAPITestClient(TestCase): self.assertIsNotNone(response.redirect_chain) self.assertEqual(response.status_code, 200) + def test_invalid_multipart_data(self): + """ + MultiPart encoding cannot support nested data, so raise a helpful + error if the user attempts to do so. + """ + self.assertRaises( + AssertionError, self.client.post, + path='/view/', data={'valid': 123, 'invalid': {'a': 123}} + ) + class TestAPIRequestFactory(TestCase): def test_csrf_exempt_by_default(self):