如何在django中的模板页面上打印文件?

时间:2012-02-29 19:04:36

标签: django file-upload django-templates django-views readfile

感谢您的帮助。

我有一个视图,允许我上传一个csv文件并阅读它。我希望将此文件的数据放在我的一个模板中(因此放在网页上)。我的观点如下:

@login_required
def uploadFunc(request, username):
 user = get_object_or_404(User, username=username)
 if request.method == 'GET':
    return render_to_response('upload.html',{'user':user},context_instance=RequestContext(request))
 elif request.method == 'POST':
    with open('penguins.csv', 'rb') as f:
        reader = csv.reader(f)
        for m in reader:
            print m
        return HttpResponseRedirect("/")

中可以看出
print m
return HttpResponseRedirect("/")

我打印提取的数据(它打印到终端,但不打印到网页),然后将上传页面重定向到我的主页penguin.csv中的表格(不要嘲笑这个名字!我知道:))应该构建。事情是我不明白(或知道)如何让我的模板index.html知道应该放在该表中的那个文件。

很抱歉很多话题,如果感到困惑,请随时提问。

再次感谢, blargie-bla

1 个答案:

答案 0 :(得分:1)

您需要先上传文件并将其保存到磁盘(或内存)中,然后需要将此状态保存到下一个请求中。您有几种方法可以做到这一点,例如在会话中。

这是一个例子,它没有经过测试,可能会有一些错误......

FILE_UPLOAD_DIR = '/tmp'

class UploadFileForm(forms.Form):
    file = forms.FileField()

@login_required
def uploadFunc(request, username):
    user = get_object_or_404(User, username=username)
    if request.method == 'GET':
        return render_to_response('upload.html',{'user':user},context_instance=RequestContext(request))
    elif request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            path = _handle_uploaded_file(request.FILES['file'])
            request.session['uploaded_file'] = path
            return HttpResponseRedirect("/")

def index(request):
    if request.session.get("uploaded_file", None):
        lines = []
        with open(request.session.pop("uploaded_file"), 'rb') as f:
            reader = csv.reader(f)
            for m in reader:
                lines.append(m)

        return render_to_response('index.html', { 'file_lines': lines }, context_instance=RequestContext(request))


def _handle_uploaded_file(source):
    fd, filepath = tempfile.mkstemp(prefix=source.name, dir=FILE_UPLOAD_DIR)
    with open(filepath, 'wb') as dest:
        shutil.copyfileobj(source, dest)
    return filepath

然后在 index.html 的模板中,您可以使用 file_lines 填充表格。

我从刚才发现的各个片段中“粘贴”了这段代码,这里是网址列表: