Django用のパッケージimport-exportは便利なものである。
xlsxやcsvのフォーマットで入出力が簡単にできる。
ただしDBにUTF-8に対応していない文字列、例えばゼロ幅スペース(\u200b)などが紛れ込んでしまった場合は
ServerError500('cp932' codec can't encode character)が発生してしまう。
Varidationを強化して対象文字列をはじく方法もあるが、今回はimport-exportを直接を修正して対応できるようにする。
環境
Server側:AWS + ubuntu + NGINX + gunicorn + Django
アクセス側:Windows PC
手順
まずはimport-exportが保存されているsite-packagesの場所を確認する。
わからない場合はこちらの記事の対処方法2を参考に。
次にExportできるようにする。
\site-packages\import_export\admin.py
# from_encoding = "utf-8"
from_encoding = "utf_8_sig"
# response = HttpResponse(export_data, content_type=content_type)
response = HttpResponse(export_data, content_type=content_type, charset='utf_8_sig')
最後にImportできるようにする。
\site-packages\import_export\tmp_storages.py
# return open(self.get_full_path(), mode)
return open(self.get_full_path(), mode, charset='utf_8_sig')
以上です。
補足
次のように記載するサイトもありましたが意図する処理がされなかったため記事にしました。
class UserAdmin(ExportMixin, admin.ModelAdmin):
...
base_formats.CSV.CONTENT_TYPE = 'text/csv; charset=CP932'
...
ありがとうございました。