【问题标题】:Django DRF PUT Request ImageFieldDjango DRF PUT 请求 ImageField
【发布时间】:2020-08-12 18:01:06
【问题描述】:

我正在使用 Django 中的 ImageField 上传图像。当我获取要在前端显示的数据时将图像保存在数据库中后,我以以下格式获取它:

{"pk":5,"employee_image":"/media/emp_temp_mast/5.png","first_name":"TEST",}

在前端更改数据后,我在表单中为相应条目发送 PUT 请求:

{"pk":5,"employee_image":"/media/emp_temp_mast/5.png","first_name":"DATA CHANGED",}

但是在发出请求后我收到以下错误:

employee_image: ["The submitted data was not a file. Check the encoding type on the form."]

我应该如何从前端调用 PUT 请求。

【问题讨论】:

  • 如果您只想更改不包含实际employee_image 字段的数据的部分,则使用PATCH 方法并且根本不包含您不想更新的字段:fetch('https://foo.bar/Baz/', { method: 'PATCH', body: '{"pk":5, "first_name": "DATA CHANGED"}')
  • 这只是一个例子,在这种情况下我需要发出一个put请求。需要将数据添加到重复表中并从此处删除
  • 我的问题基本上是从数据库中获取数据后对图像字段进行 PUT 请求的最有效方法是什么?
  • 核对发送 JSON 的ImageField 并使用所有其他字段。然后做一个PATCH。例如let send_data = {...data}; delete send_data['employee_image']; fetch([...]method:'PATCH')

标签: django django-rest-framework put


【解决方案1】:

@Ross Rogers 的建议奏效了,但我觉得它可能会有点乏味,因为我们希望每个客户端应用程序都知道他们必须在他们打算提出的每个 UPDATE 请求上对 ImageField 进行 Nuke。客户端应该能够进行这种抽象,并且不需要担心 ImageField 的处理。

为了实现这一点,我对后端接收 ImageField 的视图进行了以下更改。

class Emp_DetailView(APIView):

    def get_object(self, pk):
        try:
            return db_data
        except Emp_Mast.DoesNotExist:
            raise Http404

    def put(self, request, pk, format=None):
        db_data = self.get_object(pk)

        if(db_data["employee_image"] and db_data["employee_image"].startswith('http'))):
            img_name = dataDict["employee_image"].split("/")[-1]
            emp_img_temp = ContentFile(requests.get(dataDict["employee_image"]).content, name=img_name)
            dataDict["employee_image"] = emp_img_temp

        serializer = Emp_Mast_Serializer(db_data, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在图像 URL 上发送 GET 请求,然后将结果保存为可用于发送 PUT 请求的文件格式

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 2019-07-11
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多