【问题标题】:django rest framework - custom rendererdjango rest 框架 - 自定义渲染器
【发布时间】:2013-12-31 03:41:41
【问题描述】:

我正在尝试调整现有的 XMLRenderer 以创建自定义的 -

class CustomRenderer(renderers.BaseRenderer):
    """
    Renderer which serializes to CustomXML.
    """

    media_type = 'application/xml'
    format = 'xml'
    charset = 'utf-8'

    def render(self, data, accepted_media_type=None, renderer_context=None):
        """
        Renders *obj* into serialized XML.
        """
        if data is None:
            return ''

        stream = StringIO()

        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()
        xml.startElement("job id='string1'", {})

        self._to_xml(xml, data)

        xml.endElement("job")
        xml.endDocument()
        return stream.getvalue()

    def _to_xml(self, xml, data):
        if isinstance(data, (list, tuple)):
            for item in data:
                xml.startElement("string2", {})
                self._to_xml(xml, item)
                xml.endElement("string2")

        elif isinstance(data, dict):
            for key, value in six.iteritems(data):
                xml.startElement(key, {})
                self._to_xml(xml, value)
                xml.endElement(key)

        elif data is None:
            # Don't output any value
            pass

        else:
            xml.characters(smart_text(data))

对于 string1,我希望它从调用它的视图中获取值。 string1 = API 中 GET 的主键。

即。如果我打电话给http://localhost/API/2345 then string1 = 2345

对于 string2,我希望它返回类似于他们在以下帖子中所做的模型名称 -

Adding root element to json response (django-rest-framework)

这是自定义渲染器返回的值,以便可以将 JSON/XML 的根值设置为模型名称。

我尝试调整 CustomRenderer 以包含这些行,但是在运行我的视图时它抱怨我的 views.py 上的“object() 没有参数” -

if request.method == 'GET':
    DEV = Trgjob.objects.using('database1').filter(job_id=pk).order_by('job_order')
    serializer = CustomSerializer(DEV, many=True)
    return CustomRenderer(serializer.data)

【问题讨论】:

  • 请更好地解释您的问题。 string1 = pk pk 是什么?还要在这里描述第二个问题,而不是把我们指向另一个 url..
  • 已更新以更好地解释。

标签: python django django-rest-framework


【解决方案1】:

您似乎正试图从视图中返回渲染器实例? 您应该只从视图返回常规数据,但使用视图类上的renderer_classes 属性设置渲染器类。

class MyView(APIView):
    renderer_classes = [CustomRenderer]

    ...

    def get(self, request, pk=None):
        DEV = Trgjob.objects.using('database1').filter(job_id=pk).order_by('job_order')
        serializer = CustomSerializer(DEV, many=True)
        return Response(serializer.data)

编辑:至于从视图中获取额外的上下文到渲染器中...您可以通过检查renderer_context['view'] 来做到这一点,因此在您的render() 方法中执行这些操作...

view = renderer_context['view']
job_id = view.kwargs['job_id']

【讨论】:

  • 我很困惑,这并没有提到我将如何解析“string1”。我的序列化器、渲染器和视图工作得很好。发生的事情是我想从视图中解析另一个变量以传递给渲染器,因此当它调用“CustomRenderer”时,它也可以知道我想在我的视图中定义 string1 =“xxxx”的 string1 =“xxxx”。
  • @whoisearth - 更新了更多相关信息。
  • 我想我理解你来自哪里我试图弄清楚如何让它在我看来工作。问题是 django-rest-framework 文档中的示例实际上并未显示使用此 renderer_context 的示例。在我复制和调整的自定义渲染器中,它有 renderer_context 我不能只使用它还是因为它是单独的文件需要直接在视图中使用?
猜你喜欢
  • 1970-01-01
  • 2016-11-22
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
相关资源
最近更新 更多