如何更改根元素和列表项元素的名字吗? (django的静止框架)(How to change t

2019-10-20 01:04发布

我是新来的Django的REST的框架我有这样的工作样品

<root>
    <list-item>worrier1</list-item>
    <list-item>worrier2</list-item>
<root>

我需要的是

<Hero>
    <worrier1>worrier1</worrier1>
    <worrier2>worrier2</worrier2>
<Hero>

Answer 1:

这些都是硬编码值,所以你得到的唯一的机会,就是通过重写创建自定义呈现XMLRenderer (这实际上是几乎整个班级),并使用自定义的呈现在您的视图。



Answer 2:

在被帮助的其他人谁该搜索...下面的精神是如何可以继承的XMLRenderer并重写根标签(以前的“根”)和项目标签(以前“列表项”),以任何你喜欢的。

from django.utils.six.moves import StringIO
from django.utils.xmlutils import SimplerXMLGenerator
from rest_framework_xml.renderers import XMLRenderer

class ModifiedXMLRenderer(XMLRenderer):
    item_tag_name = "item"
    root_tag_name = "channel"

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

        stream = StringIO()

        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()
        xml.startElement(self.root_tag_name, {})

        self._to_xml(xml, data)

        xml.endElement(self.root_tag_name)
        xml.endDocument()
        return stream.getvalue()

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

        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))


Answer 3:

我不认为你需要去这么远,创造出一个子类,我能够通过创建实例后重写实例变量和运行呈现之前,请参见下面这样做:

renderer = XMLRenderer()
renderer.item_tag_name = 'warrior'
renderer.root_tag_name = 'Hero'
content = renderer.render(serializer.data)

希望可以帮助其他人谁绊倒通过



Answer 4:

如果你想一般做到这一点,你不需要重写太多类:

class MyXMLRenderer(XMLRenderer):
    """Override XML tag names."""

    root_tag_name = 'file'
    item_tag_name = 'instance'


Answer 5:

谁想要编辑的实际的包,你可以去你的Python文件夹,站点包装,rest_framework_xml和编辑renderers.py

当你到达那里,你可以编辑: item_tag_name = 'list-item' ,并更改为item_tag_name = 'item'

注:通过这种方法,你将覆盖实际的类。 对于我的项目,也不要紧,但如果你打算使用XML库的另一个Django项目,只要记住这一点。



文章来源: How to change the root element and list-item elements name? (django-rest-framework)