Django REST Framework 不以 PUT 形式显示值

cez*_*zar 1 python django django-rest-framework

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

在 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>
Run Code Online (Sandbox Code Playgroud)

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

<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>
Run Code Online (Sandbox Code Playgroud)

以下是说明问题的屏幕截图: 在此处输入图片说明 在此处输入图片说明

您可以看到键“类”的值在那里。输入元素的名称以及模型中的字段名称是“class_name”。

我翻了翻源代码,发现表单是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 存储。你可以克隆它或分叉它并尝试帮助我。
非常感谢!

Tar*_*ani 6

我想出了另一种对我来说似乎很好用的方法。这是为类外的序列化程序定义一个类字段:

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")
Run Code Online (Sandbox Code Playgroud)

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

HTML 表单

原始数据