昨天我发布了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>
您可以看到键&#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。您可以克隆它或分叉它并尝试帮助我 非常感谢!
答案 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表单看起来都很好: