昨天我发布了一个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>
您可以看到键“class”的值在那里。输入元素的名称以及模型中的字段名称是“class_name”。
我查看了源代码,发现表单是按以下顺序在文件 renderers.py
中呈现的:
- 在类
BrowsableAPIRenderer
中,方法get_context
创建表单并调用方法get_rendered_html_form
。 - 方法
get_rendered_html_form
调用方法render_form_for_serializer
。 - 方法
render_form_for_serializer
调用类HTMLFormRenderer
的方法render
。
但我还是不知道该去哪里干预,该改什么。
我也尝试在序列化器中实现to_internal_value
方法,但这只是为了反序列化,与表单渲染无关。
有没有人知道问题出在哪里以及可以做什么?
更新
我已经创建了 GitHub repo与代码。您可以克隆它或 fork 它并尝试帮助我。
非常感谢!
最佳答案
我想出了另一种方法,似乎对我来说效果很好。这是为类外的序列化程序定义一个类字段:
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 表单看起来都很好:
关于python - Django REST Framework 不以 PUT 形式显示值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654662/