본문 바로가기
Errors

[Error] Django Rest Framework (DRF) : "The submitted data was not a file. Check the encoding type on the form."

by ds31x 2023. 9. 14.

DRF에서 ImageField의 경우, JSON으로 serialize된 이후엔 URL로 기재된다.

 

DRF에서 기본으로 제공하는 API view를 이용할 때, 특정 id의 Detail에 대해 patch를 수행할 경우,

기본값으로 저장된 URL 문자열이 ImageField의 key에 할당되어있기 때문에 

patch를 수행할 경우 POST로 보내지는 file이 아니라고 에러가 뜨게 되다.

 

User의 profile등에 이미지가 있을 수 밖에 없는데...

patch로 다른 field를 수정하려고 하면 이미지에 해당하는 field가 URL문자열이다보니 해당 에러가 발생하게 된다.

 

put의 경우엔 전체 field를 다 업데이트하기 때문에 이미지에 해당하는 field에 대해 다시 이미지 전송이 되어야 하는데,

이때 해당 image를 보내지 않으면 역시 에러가 난다.

 

우선 put의 경우엔 image가 변경되지 않았다하더라도 원래 put behavior가 전체를 다시 보내서 갱신하는 것이니 다시보내도록 client에서 처리하는게 낫다.

 

patch는 좀 까다로운데, 우선 image를 수정하는 경우라면 다시 보내도록 처리해야하고, 아닌 경우엔 request.data에서 이미지에 해당하는 field를 모두 제거해야한다. 즉, 변경될 field만 보내고 그대로 유지할 field들은 모두 빼버려야 한다.

 

때문에 view.py 에서 patch를 overriding한 후, request.data에서 이미지에 해당하는 field의 type이 str인 경우면 실제 이미지 업로드가 되지 않은 경우이므로 그냥 pop메소드로 제거해버리고 난 이후에 처리되도록 코드를 수정하였다.

 

단, put은 client에서 다시 이미지를 보내줘야 한다. ==;;