【问题标题】:Django REST Framework doesn't display value in PUT formDjango REST Framework 不以 PUT 形式显示值
【发布时间】:2018-05-19 04:13:04
【问题描述】:

昨天我发布了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。您可以克隆它或分叉它并尝试帮助我。
非常感谢!

【问题讨论】:

  • 你能提供一个repo来调试吗?最明显的问题可能是渲染器代码尝试使用class_name 而不是class 需要调试可以覆盖的位置。所以如果你提供一个 repo 来调试会更容易
  • @TarunLalwani 感谢您的回复!是的,这就是问题所在,但我不知道在哪里进行干预。你对回购有什么具体的建议吗?否则我会把代码示例放在 GitHub 上。
  • @TarunLalwani 我在 GitHub 上创建了一个仓库。请检查更新的答案。

标签: python django django-rest-framework


【解决方案1】:

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

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 表单看起来都很好:

【讨论】:

  • 太棒了!这是一个很好的解决方案。非常简单,直接和pythonic。不幸的是,我在官方文档中找不到任何关于此的提示。您能否将这个答案也添加到我之前的问题中,链接在上面。在这里我只能投票一次。
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多