[Django] アップロードファイルのテストをしたい
2018-06-11

こんばんは、今回の記事は短いので若干冗長に書いてみました。

そして、テストって書いたけどテストそこまで関係ないですw

何がしたいか

Django で アップロードされたファイルオブジェクトを手動でつくりたいことがあります。 たとえば FileFieldImageField などを使っている場合です。

しかし、 open('test.txt') のようなただのファイルオブジェクトを与えても

エラー

The submitted data was not a file. Check the encoding type on the form.

のようなエラーが発生します。

Django が扱うファイルオブジェクトは django.core.files.File を期待するようです。

どうすればいいか

そこで 実際にあるファイルを使う場合は

from django.core.files import File

# パスは自由に変えてね
f = File(open('test.png'))
# あとはご自由に
serializer = MySerializer({'photo': f})
serializer.save()

のようにし、

コンテンツの中身を 自分で指定したい場合は

from django.core.files.base import ContentFile
# 引数は(ファイルの中身, ファイル名)
f = ContentFile(b'file content', 'test.txt')
# あとはご自由に
user.uploaded = f
user.save()

のようにします。

備考

全然関係ないけど UnicodeEncodeError: 'utf-8' codec can't encode characters in position 17-28: surrogates not allowed

(サロゲートペアじゃないのに)みたいに言われたときは LC_ALL が設定されてない可能性があるので

$ export LC_ALL=en_US.UTF-8 みたいにしてから再実行するとうまくいくことがあります。

ちなみに、指定できるのは 以下のようにすればわかります

$ locale -a
C
en_US.utf8
POSIX

django.core.files.uploadedfile.SimpleUploadedFile とどっちがいいのかはわかりません。

ドキュメントのURL的に Form で使われる想定だったりするのかな。

ま、テストだから多少はね?

こちらからは以上です。

参考