Skip to content

Browsable api raises AttributeError when posting raw data not containing data for nested serializer  #3260

Closed
@jgadelange

Description

@jgadelange

When I post an empty object ({}) using the raw data form in the browsable API I get an AttributeError, when I have a nested serializer defined on the serializer set for that view. Example code and stack trace can be found below.

Example code:

class NestedSerializer(serializers.Serializer):
    sub_field = serializers.CharField()


class MainSerializer(serializers.Serializer):
    nested = NestedSerializer()


class TestView(APIView):
    serializer_class = MainSerializer

    def get_serializer(self, **kwargs):
        return self.serializer_class(**kwargs)

    def post(self, request, format=None):
        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            serializer.create(serializer.validated_data)
            return Response(serializer.data, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Traceback (most recent call last):
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/core/handlers/base.py", line 164, in get_response
    response = response.render()
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/response.py", line 158, in render
    self.content = self.rendered_content
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/response.py", line 60, in rendered_content
    ret = renderer.render(self.data, media_type, context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/renderers.py", line 669, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/renderers.py", line 646, in get_context
    'post_form': self.get_rendered_html_form(data, view, 'POST', request),
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/renderers.py", line 513, in get_rendered_html_form
    [('template', 'rest_framework/api_form.html')]
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/renderers.py", line 367, in render
    return template.render(context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/backends/django.py", line 74, in render
    return self.template.render(context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/base.py", line 209, in render
    return self._render(context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/base.py", line 201, in _render
    return self.nodelist.render(context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/base.py", line 903, in render
    bit = self.render_node(node, context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/debug.py", line 79, in render_node
    return node.render(context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/defaulttags.py", line 217, in render
    nodelist.append(node.render(context))
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/defaulttags.py", line 329, in render
    return nodelist.render(context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/base.py", line 903, in render
    bit = self.render_node(node, context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/debug.py", line 79, in render_node
    return node.render(context)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/django/template/base.py", line 1195, in render
    return func(*resolved_args, **resolved_kwargs)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py", line 31, in render_field
    return renderer.render_field(field, style)
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/renderers.py", line 325, in render_field
    field = field.as_form_field()
  File "<path_to_virtualenv>/lib/python2.7/site-packages/rest_framework/utils/serializer_helpers.py", line 99, in as_form_field
    for key, value in self.value.items():
AttributeError: 'NoneType' object has no attribute 'items'

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions