python - Django REST Framework 不以 PUT 形式显示值

标签 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

您可以看到键“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 表单看起来都很好:

HTML Form

Raw Data

关于python - Django REST Framework 不以 PUT 形式显示值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654662/

相关文章:

.net - Python vs C#/.NET——使用 Python 开发大型 Web 应用程序需要考虑的主要区别是什么?

python - 我如何将 DecimalField 转换为在 Python Django 中 float ?

django - 如何在 Django REST 框架中正确设置 HTTP_405_METHOD_NOT_ALLOWED 状态代码的允许 header

python - 使用 openpyxl 操作现有的 excel 表

python - 从 web2py 的列表中选择具有静态内容的 Widget Model Form

python - Facebook 将不正确的数据传递给数据库

python - PySpark partitionBy、repartition 还是什么都不做?

Django 管理网址

python - 电子邮件验证和密码重置 - django rest 框架和 angularjs

Django Rest Framework JWT 400 错误请求