【发布时间】:2016-06-07 15:40:19
【问题描述】:
我正在编写一个页面来上传 .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 函数或如何从中读取。我就是想不通。你能帮助我吗?如果您对如何以更简单的方式或正确的方式进行操作有任何建议,请告诉我。
感谢您的帮助
【问题讨论】:
-
当你传递给
import_contents时不要调用read()。 -
@DanielRoseman 成功了,谢谢!现在我必须处理正确的 .csv 阅读。当我使用 row[0] 时,它返回整行,而不是第 0 列。但这是我现在需要弄清楚的事情。