Pass serializer to HTMLFormRenderer and BrowsableAPIRenderer through renderer_context rather than .data

This commit is contained in:
Anton-Shutik 2020-04-14 14:45:09 +03:00
parent 8cba4f87ca
commit 3ad465d92b
4 changed files with 12 additions and 27 deletions

View File

@ -355,7 +355,7 @@ class HTMLFormRenderer(BaseRenderer):
Render serializer data and return an HTML form, as a string.
"""
renderer_context = renderer_context or {}
form = data.serializer
form = renderer_context.get('serializer')
style = renderer_context.get('style', {})
if 'template_pack' not in style:
@ -518,7 +518,10 @@ class BrowsableAPIRenderer(BaseRenderer):
return form_renderer.render(
serializer.data,
self.accepted_media_type,
{'style': {'template_pack': 'rest_framework/horizontal'}}
{
'style': {'template_pack': 'rest_framework/horizontal'},
'serializer': serializer
}
)
def get_raw_data_form(self, data, view, method, request):

View File

@ -539,14 +539,6 @@ class Serializer(BaseSerializer, metaclass=SerializerMetaclass):
return JSONBoundField(field, value, error)
return BoundField(field, value, error)
# Include a backlink to the serializer class on return objects.
# Allows renderers such as HTMLFormRenderer to get the full field info.
@property
def data(self):
ret = super().data
return ReturnDict(ret, serializer=self)
@property
def errors(self):
ret = super().errors
@ -737,14 +729,6 @@ class ListSerializer(BaseSerializer):
def __repr__(self):
return representation.list_repr(self, indent=1)
# Include a backlink to the serializer class on return objects.
# Allows renderers such as HTMLFormRenderer to get the full field info.
@property
def data(self):
ret = super().data
return ReturnList(ret, serializer=self)
@property
def errors(self):
ret = super().errors

View File

@ -78,7 +78,7 @@ def get_pagination_html(pager):
def render_form(serializer, template_pack=None):
style = {'template_pack': template_pack} if template_pack else {}
renderer = HTMLFormRenderer()
return renderer.render(serializer.data, None, {'style': style})
return renderer.render(serializer.data, None, {'style': style, 'serializer': serializer})
@register.simple_tag

View File

@ -499,17 +499,15 @@ class TestHTMLFormRenderer(TestCase):
def test_render_with_default_args(self):
self.serializer.is_valid()
renderer = HTMLFormRenderer()
result = renderer.render(self.serializer.data)
result = self.renderer.render(self.serializer.data, renderer_context={'serializer': self.serializer})
self.assertIsInstance(result, SafeText)
def test_render_with_provided_args(self):
self.serializer.is_valid()
renderer = HTMLFormRenderer()
result = renderer.render(self.serializer.data, None, {})
result = self.renderer.render(self.serializer.data, None, {'serializer': self.serializer})
self.assertIsInstance(result, SafeText)
@ -531,7 +529,7 @@ class TestChoiceFieldHTMLFormRenderer(TestCase):
def test_render_initial_option(self):
serializer = self.TestSerializer()
result = self.renderer.render(serializer.data)
result = self.renderer.render(serializer.data, renderer_context={'serializer': serializer})
self.assertIsInstance(result, SafeText)
@ -544,7 +542,7 @@ class TestChoiceFieldHTMLFormRenderer(TestCase):
serializer = self.TestSerializer(data={'test_field': '12'})
serializer.is_valid()
result = self.renderer.render(serializer.data)
result = self.renderer.render(serializer.data, renderer_context={'serializer': serializer})
self.assertIsInstance(result, SafeText)
@ -572,7 +570,7 @@ class TestMultipleChoiceFieldHTMLFormRenderer(TestCase):
serializer = TestSerializer(data={'test_field': ['12']})
serializer.is_valid()
result = self.renderer.render(serializer.data)
result = self.renderer.render(serializer.data, renderer_context={'serializer': serializer})
self.assertIsInstance(result, SafeText)
@ -591,7 +589,7 @@ class TestMultipleChoiceFieldHTMLFormRenderer(TestCase):
serializer = TestSerializer(data={'test_field': ['12']})
serializer.is_valid()
result = self.renderer.render(serializer.data)
result = self.renderer.render(serializer.data, renderer_context={'serializer': serializer})
self.assertIsInstance(result, SafeText)