将csv内容传递给模板

时间:2012-05-28 19:29:08

标签: django

将csv内容传递给模板。并得到错误。感谢

  def ....
    with open('csv', 'rb') as f:
      reader = csv.reader(f)
    return render(request, template, {"results": reader})

错误

I/O operation on closed file

Full Traceback

2 个答案:

答案 0 :(得分:3)

with引入了一个新的上下文管理器,在文件的情况下,它会在结束后关闭它的参数。但是,您的上下文管理器在下一行结束,因此在调用render函数时,文件将关闭,并且csv阅读器无法运行。

您可以将return一个缩进向右移动,或者在with内更好地调用渲染,但将其保存到随后传递给return的变量中:

with open('csv', 'rb') as f:
    reader = csv.reader(f)
    html = render(request, template, {"results": reader})
return html

答案 1 :(得分:0)

问题是您是将读取器对象传递给模板(在其上进行迭代),但由于它不在with块中,因此文件已关闭。

为了纠正这种情况,一种方法是将生成器转换为一些可迭代的序列。

例如:

def foo(request):
    lines = []
    with open('foo.csv', 'rb') as f:
        lines = [line for line in csv.reader(f)]
    return render(request, template, {'results': lines})