合作我有這樣的形式:的Django FileField或不使用Python 3的CSV模塊
class CSVImportForm(AuthorshipMixin, FormMixin, forms.Form):
data = forms.FileField()
def import_csv(self):
school_csv = csv.DictReader(self.cleaned_data['data'])
for row in school_csv:
print(row)
的import_csv()
的預期目的是導入CSV到應用程序的數據庫,但它已經被改變爲簡潔起見。
當我嘗試遍歷school_csv
,我猜會出現一個例外是當DictReader
首先嚐試讀取文件:
Traceback:
File "/usr/local/lib/python3.5/dist-packages/django/core/handlers/base.py" in get_response
132. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/base.py" in dispatch
89. return handler(request, *args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/django/views/generic/edit.py" in post
215. return self.form_valid(form)
File "/opt/project/project/import/views.py" in form_valid
16. form.import_csv()
File "/opt/project/project/import/forms.py" in import_csv
67. for row in school_csv:
File "/usr/lib/python3.5/csv.py" in __next__
109. self.fieldnames
File "/usr/lib/python3.5/csv.py" in fieldnames
96. self._fieldnames = next(self.reader)
Exception Type: Error at /import/
Exception Value: iterator should return strings, not bytes (did you open the file in text mode?)
我不相信,我提出了與機會永遠選擇打開文件的模式。我如何能夠在文本模式下打開,以便csv模塊處理它?
我注意到InMemoryUploadedFile
有一個file
屬性,它似乎很有用,但它是一個io.BytesIO
對象。我想我可以做一些魔術,包括手動指定encoding.etc,但我想這是Django會讓事情變得更容易。
解決此問題的最佳方法是什麼?
請將完整的錯誤追溯添加到您的文章! –
@ KlausD.Sorry,完成! –
嘗試以文本模式重新打開該文件:https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.fields.files.FieldFile.open –