Fixes BrowsableAPIRenderer for usage with ListSerializer. by NiyazNz · Pull Request #7530 · encode/django-rest-framework (original) (raw)

When using ListSerializer as viewset serializer_class rendering of view in BrowsableAPI fails with:

Internal Server Error: /api/snippets/
Traceback (most recent call last):
  File "/home/nz/.local/lib/virtualenvs/django-rest-framework-demo/lib/python3.11/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "/home/nz/.local/lib/virtualenvs/django-rest-framework-demo/lib/python3.11/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
               ^^^^^^^^^^^^^^^^^
  File "/home/nz/.local/lib/virtualenvs/django-rest-framework-demo/lib/python3.11/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
                   ^^^^^^^^^^^^^^^^^^^^^
  File "/home/nz/dev/.oss/django-rest-framework/rest_framework/response.py", line 74, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/nz/dev/.oss/django-rest-framework/rest_framework/renderers.py", line 725, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/nz/dev/.oss/django-rest-framework/rest_framework/renderers.py", line 656, in get_context
    raw_data_post_form = self.get_raw_data_form(data, view, 'POST', request)
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/nz/dev/.oss/django-rest-framework/rest_framework/renderers.py", line 564, in get_raw_data_form
    for name, field in serializer.fields.items():
                       ^^^^^^^^^^^^^^^^^
AttributeError: 'MultipleSnippetSerializer' object has no attribute 'fields'
[12/Jun/2023 08:41:53] "GET /api/snippets/ HTTP/1.1" 500 97475

BrowsableAPIRenderer cannot render multiple objects in HTML form and should render list example in Raw data.

This PR fixes the issue described above by rendering list of items in Raw data tab and not rendering HTML data tab while ListSerializer is used for viewset serializer_class.
image