Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Horizontal fieldset breaks in admin and api browser when read_only is False for nested serializers #3704

Closed
mcastle opened this issue Dec 5, 2015 · 7 comments

Comments

@mcastle
Copy link
Contributor

mcastle commented Dec 5, 2015

There's no error for json. And this doesn't happen for every serializer with a nested serializer - it seems to occur only when the nested serializer itself has a nested serializer. This is using django rest framework version 3.3.1. Here's the traceback:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/api/endpoints/3/

Django Version: 1.8.7
Python Version: 2.7.10

Template error:
In template /Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/templates/rest_framework/horizontal/fieldset.html, error at line 13
   'unicode' object has no attribute 'items'

   3 :   {% if field.label %}
   4 :     <div class="form-group" style="border-bottom: 1px solid #e5e5e5">
   5 :       <legend class="control-label col-sm-2 {% if style.hide_label %}sr-only{% endif %}" style="border-bottom: 0">
   6 :         {{ field.label }}
   7 :       </legend>
   8 :     </div>
   9 :   {% endif %}
   10 : 
   11 :   {% for nested_field in field %}
   12 :     {% if not nested_field.read_only %}
   13 :        {% render_field nested_field style=style %} 
   14 :     {% endif %}
   15 :   {% endfor %}
   16 : </fieldset>
   17 : 

Traceback:
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  164.                 response = response.render()
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/response.py" in render
  158.             self.content = self.rendered_content
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/response.py" in rendered_content
  71.         ret = renderer.render(self.data, media_type, context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in render
  711.         context = self.get_context(data, accepted_media_type, renderer_context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in get_context
  738.             data, accepted_media_type, renderer_context
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in get_context
  648.             'put_form': self.get_rendered_html_form(data, view, 'PUT', request),
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in get_rendered_html_form
  499.                 {'style': {'template_pack': 'rest_framework/horizontal'}}
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in render
  357.         return template.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/backends/django.py" in render
  74.         return self.template.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  210.                     return self._render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  905.                 bit = self.render_node(node, context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  217.                             nodelist.append(node.render(context))
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  329.                 return nodelist.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  905.                 bit = self.render_node(node, context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  1197.                     return func(*resolved_args, **resolved_kwargs)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py" in render_field
  37.     return renderer.render_field(field, style)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in render_field
  337.         return template.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/backends/django.py" in render
  74.         return self.template.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  210.                     return self._render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  905.                 bit = self.render_node(node, context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  217.                             nodelist.append(node.render(context))
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  329.                 return nodelist.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  905.                 bit = self.render_node(node, context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  1197.                     return func(*resolved_args, **resolved_kwargs)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py" in render_field
  37.     return renderer.render_field(field, style)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in render_field
  337.         return template.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/backends/django.py" in render
  74.         return self.template.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  210.                     return self._render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  96.     return self.nodelist.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  905.                 bit = self.render_node(node, context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  217.                             nodelist.append(node.render(context))
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/defaulttags.py" in render
  329.                 return nodelist.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  905.                 bit = self.render_node(node, context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/debug.py" in render_node
  79.             return node.render(context)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/django/template/base.py" in render
  1197.                     return func(*resolved_args, **resolved_kwargs)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/templatetags/rest_framework.py" in render_field
  37.     return renderer.render_field(field, style)
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/renderers.py" in render_field
  325.         field = field.as_form_field()
File "/Users/user/virtualenvs/ddrsite/lib/python2.7/site-packages/rest_framework/utils/serializer_helpers.py" in as_form_field
  111.         for key, value in self.value.items():

Exception Type: AttributeError at /api/endpoints/3/
Exception Value: 'unicode' object has no attribute 'items'
@xordoquy
Copy link
Collaborator

xordoquy commented Dec 7, 2015

@mcastle do you have a code sample we could use to reproduce the issue ?

@hellraider01
Copy link

how it resolve the error? i have the same problem and in my case we will try to list a one "comment" from a list of comment. The model have ManyToManyField called comments. And the serializer of comment have the attribute many=True. Why append this?

@hellraider01
Copy link

i forgot, the Traceback is exactly the same.

@hellraider01
Copy link

the serializres inside the classes that use is: comments = CommentSerializer(many=True, read_only=True)

@mcastle
Copy link
Contributor Author

mcastle commented Sep 21, 2016

Fixed by #4473.

@mcastle mcastle closed this as completed Sep 21, 2016
@tomchristie
Copy link
Member

Thanks for the update @mcastle!

@mcastle
Copy link
Contributor Author

mcastle commented Sep 21, 2016

For sure!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants