-2

好的,我知道我有很多相同的问题,但我没有找到任何答案来解决我的问题。我是 Django 的新手,所以请记住。

我需要做一个从中上传文件的操作:

这是我的upload.py(这是一个views.py)

from django.http import HttpResponse
def upload(request)
  viewfile = HttpResponse()
  viewfile.write('''
             <html>
             <body>
             <form action="/upload_done/" method="POST" enctype="multipart/form-data" {% csrf_token %}>
                 <label for="file">Filename:</label>
                 <input type="file" name="up_file" >
                  <br />
                  <input type="submit" name="submit" value="Submit" >
             </form>
    return HttpResponse(viewfile)

现在我的upload_done.py:

from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponse
import tempfile
import shutil
def upload_done(request):
  viewfile = HttpResponse()
  #####First I Tried this
  Up_file = request.FILES['up_file']
   """ It gives multivalue error('' 'up_file' '')
  # then I change my upload.py input type file to text & try to collect information
  # and change here Up_file = request.FILES['up_file'] to this
   Up_file = request.POST['up_file']

现在我从 Django doc 收到 403 csrf 错误,我无法理解模板(只能理解 file.html 应该与 views.py 的函数名称相同的名称)是如何工作的。

请帮助我如何使用发布方法和如何上传文件。谢谢提前...

我也试过这样(写在/home/user/myproject/template/upload_form.html)(注意:模板目录可以正常工作)

<html>
             <body>
             <form action="/upload_done/" method="POST" enctype="multipart/form-data" {% csrf_token %}>
                 <label for="file">Filename:</label>
                 <input type="file" name="up_file" >
                  <br />
                  <input type="submit" name="submit" value="Submit" >
             </form>

& 在上面的 2nd Views.py(即 upload_form.py)中,将 'Up_file = request.FILES['up_file']' 替换为此

if request.method == 'POST':
    return render(request, 'upload_form.html',{})

但出现错误(必须返回 HttpResponse)

4

2 回答 2

2

您不能将 HTML 直接写入您的视图并期望它自动被视为模板。虽然您可以将该字符串传递给模板渲染系统,但有很好的理由将模板和视图分开。

请返回并再次查看所有向您展示如何呈现模板的示例,并这样做而不是硬编码您的 HTML。该教程非常好,向您展示了如何做到这一点,所以没有必要说“我无法理解模板是如何工作的”。

此外,您不应为每个视图编写单独的 Python 文件。每个文件中可以有多个视图函数。当你学习完模板之后,你就可以去阅读关于表单的文档了。

于 2014-02-07T10:13:35.003 回答
2

这就是它的样子:

上传表单.html:

<form method="POST" enctype="multipart/form-data" >
{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" name="submit" value="Submit" >
</form>

查看(基于文档中的示例):

from django import forms
class UploadFileForm(forms.Form):
    up_file = forms.FileField()

def handle_uploaded_file(f):
    with open('some/file/name.xls', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)

from django.http import HttpResponseRedirect
from django.shortcuts import render
def upload(request):
    if request.method == "POST":
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['up_file'])
            return HttpResponseRedirect('/upload_done/')

    form = UploadFileForm()
    return render(request, 'upload_form.html', {'form': form})

这只是一个骨架。没有数据处理,没有错误处理,也没有关于重定向后的视图。即使您面临最后期限的压力,如果对框架没有一点了解,您也无法操作此示例。所以花点时间复习一下教程。我不能充分伸展这个。不长,很详细。

编辑

我使用 django 表单将示例更新为完整的文件处理示例。我发现使用表单进行处理但然后使用函数保存文件很奇怪,但是看到文档是这样做的,我不会走另一种方式

于 2014-02-07T10:58:27.327 回答