Django - 如何从内存中的.csv文件导入

时间:2016-06-07 15:40:19

标签: python django csv

我正在编写一个页面来上传.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函数或如何从中读取。我无法弄明白。你能帮助我吗?如果您对如何以更简单的方式或正确的方式提出建议,请告诉我。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

这是你的问题。

self.import_contents(request.FILES['file'].read())

csv.reader()需要一个像object这样的文件,而不是它的内容。

This绝对可以解释为一个相关的答案。