Django REST Framework不以PUT形式显示值

时间:2017-12-05 13:20:19

标签: python django django-rest-framework

昨天我发布了question并找到了解决该问题的方法。然而,解决方案引起了另一个问题 请看一下这个问题,所以我不必复制内容。

在Browsable API中,' class_name'的值没有以PUT形式显示。

呈现的HTML如下所示:

<div class="form-group ">
  <label class="col-sm-2 control-label ">
    Class
  </label>

  <div class="col-sm-10">
    <input name="class_name" class="form-control" type="text">
  </div>
</div>

对于其他字段,它会正确显示值,例如:

<div class="form-group ">
  <label class="col-sm-2 control-label ">
    Order
  </label>

  <div class="col-sm-10">
    <input name="order" class="form-control" value="Carnivora" type="text">
  </div>
</div>

以下是说明问题的屏幕截图: enter image description here enter image description here

您可以看到键&#34;类&#34;的值。在那儿。输入元素的名称以及模型中的字段名称为&#34; class_name&#34;。

我搜索了源代码,发现表单按以下顺序呈现在文件renderers.py中:

  • 在课程BrowsableAPIRenderer中,方法get_context创建表单并调用方法get_rendered_html_form
  • 方法get_rendered_html_form调用方法render_form_for_serializer
  • 方法render_form_for_serializer调用类render的方法HTMLFormRenderer

但我仍然不知道在哪里干涉,我应该改变什么。

此外,我尝试在序列化程序中实现方法to_internal_value,但这仅用于反序列化,与表单呈现无关。

有没有人知道问题在哪里以及可以做些什么?

更新

我用代码创建了GitHub repo。您可以克隆它或分叉它并尝试帮助我 非常感谢!

1 个答案:

答案 0 :(得分:4)

我找到了另一种似乎对我来说很好的方式。这是为了在类外部为序列化器定义一个类字段:

class SpeciesSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Species
        fields = (
            'url', 'id', 'canonical_name', 'slug',  'species', 'genus',
            'subfamily', 'family', 'order','class', 'phylum',
            'ncbi_id', 'ncbi_taxonomy',
        )
        read_only_fields = ('slug',)
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }

SpeciesSerializer._declared_fields["class"] = serializers.CharField(source="class_name")

之后原始数据和HTML表单看起来都很好:

HTML Form

Raw Data