我正在编写一个页面来上传.csv文件并将其内容导入我的模型中。我目前的观点:
class ContentImport(LoginRequiredMixin, PermissionRequiredMixin,View):
permission_required = 'delivery.change_delivery'
def get(self, request, *args, **kwargs):
form = UploadFileForm()
return render(request, 'delivery/content_import.html', { 'form': form })
def import_contents(self, f):
reader = csv.reader(f)
for row in reader:
print row[0]
def post(self, request, *args, **kwargs):
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
self.import_contents(request.FILES['file'].read())
messages.add_message(self.request, messages.SUCCESS, "Contents deleted successfully.")
return redirect(reverse('delivery:delivery-detail', args=[self.kwargs['delivery_id']]))
else:
messages.add_message(self.request, messages.ERROR, "Select a file to upload.")
return redirect(reverse('delivery:delivery-content-import', args=[self.kwargs['delivery_id']]))
我的问题是关于import_contents
方法及其self.import_contents(request.FILES['file'].read())
的调用。当我print row[0]
时,我收到以下错误:列表索引超出范围。
我对此视图的想法是上传文件,而不是将其保存在服务器中,从内存中读取.csv并在我的模型中创建新记录。这是从.csv读取的,我从stackoverflow中的其他答案得到了。
我认为问题是我如何将文件传递给import_contents函数或如何从中读取。我无法弄明白。你能帮助我吗?如果您对如何以更简单的方式或正确的方式提出建议,请告诉我。
感谢您的帮助
答案 0 :(得分:3)
这是你的问题。
self.import_contents(request.FILES['file'].read())
csv.reader()
需要一个像object这样的文件,而不是它的内容。
This绝对可以解释为一个相关的答案。