3

I follow this question which help me to know how override my JSONRenderer, but occurs me another doubt about How can I provide a arg to my overridden JSONRenderer so I can change my 'element' name as I want:

please take a look on the following snippet:

from rest_framework.renderers import JSONRenderer

class EmberJSONRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):
        data = {'element': data}
        return super(EmberJSONRenderer, self).render(data, accepted_media_type, renderer_context)

My intention is change this 'element' for a variable that i would like to get by arg for this reason I tried this :

in renderers.py

from rest_framework.renderers import JSONRenderer

class EmberJSONRenderer(JSONRenderer):
    def __init__(self,myarg='teste'):
        self.myarg = myarg

    def render(self, data, accepted_media_type=None, renderer_context=None):
        data = {self.myarg:data}

        return super(EmberJSONRenderer, self).render(data, accepted_media_type, renderer_context)

in views.py:

class myViewSet(viewsets.ModelViewSet):
    myrender = EmberJSONRenderer(myarg='abc')
    renderer_classes =  (myrender, BrowsableAPIRenderer, )
    queryset = mymodel.objects.filter(myfilter=2)
    serializer_class = mySerializer
    allowed_methods = ('GET','OPTIONS','HEAD')

this raise the following typeerror:

'EmberJSONRenderer' object is not callable

Do you have any suggestion how can i pass information from my view directly to renderer as arg?

Cœur
  • 37,241
  • 25
  • 195
  • 267
ePascoal
  • 2,362
  • 6
  • 26
  • 44

1 Answers1

4

Hi everyone this was an approach that i found here and works for me. Instead of passing a var through my JSONRenderer i did the following:

in serializer.py:

class mySerializer(serializers.ModelSerializer):
        ...

  class Meta:
            model = ...
            service_name = 'mycustom name'
            fields = ...

than in my renderer.py:

from rest_framework.renderers import JSONRenderer

class EmberJSONRenderer(JSONRenderer):

    def render(self, data, accepted_media_type=None, renderer_context=None):
    service_name = getattr(renderer_context.get('view').get_serializer().Meta, 'service_name', 'objects')


        data = {service_name:{'name_pt':'name', 'keywords':data}}

        return super(EmberJSONRenderer, self).render(data, accepted_media_type, renderer_context)

as you can see i use the renderer_context to get information from view using getattr method:

getattr(renderer_context.get('view').get_serializer().Meta, 'service_name', 'objects')
Community
  • 1
  • 1
ePascoal
  • 2,362
  • 6
  • 26
  • 44
  • Thanks! it worked for me, I needed to pass different functions for render method depending on the class. – montxe Nov 27 '19 at 22:37