Django上传和处理文件没有数据保留

时间:2016-02-07 12:59:35

标签: python django dropzone.js

Python:2.7.11

Django:1.9

我想将一个csv文件上传到Django并用Python类进行分析。不允许保存,只需要文件到达要分析的类。我正在使用Dropzone.js作为表单,但我不明白我应该如何配置/编程视图来实现这一点。

<form action="/upload/" method="post" enctype="multipart/form-data" class="dropzone" id="dropzone">
    {% csrf_token %}
    <div class="fallback">
        <input name="file" type="file" multiple />
    </div>
</form>

我找到了一个article,但它描述了保存并基于Django 1.5。

view.py

def upload(request):
    if request.method == 'POST':
        file = FileUploadForm(request.POST)
        if file.is_valid():
            return HttpResponseRedirect('/upload/')
    else:
        file = FileUploadForm()

    return render(request, 'app/upload.html', {'file': file})

forms.py

from django import forms
class FileUploadForm(forms.Form):
    file = forms.FileField()

结束更新: 帮助答案和我的情况之间最重要的区别是我必须解码我的输入。 请参阅以下行,作为handle_csv_data中的我的csv_file:

StringIO(content.read().decode('utf-8-sig'))

1 个答案:

答案 0 :(得分:1)

在视图函数中访问csv文件。如果您使用的是python 3,则必须将InMemoryUploadedFile包装在TextIOWrapper中以使用csv模块对其进行解析。

在此示例中,csv被解析并作为名为&#39; content&#39;的列表传回。将显示为表格。

<强> views.py

import csv
import io  # python 3 only

def handle_csv_data(csv_file):
    csv_file = io.TextIOWrapper(csv_file)  # python 3 only
    dialect = csv.Sniffer().sniff(csv_file.read(1024), delimiters=";,")
    csv_file.seek(0)
    reader = csv.reader(csv_file, dialect)
    return list(reader)


def upload_csv(request):
    csv_content=[]
    if request.method == 'POST':
        csv_file = request.FILES['file'].file
        csv_content = handle_csv_data(csv_file)  
    return render(request, 'upload.html', {'content':content})

您的原始代码没有正确使用django的表单框架,所以我从这个示例中删除了它。因此,当上传的文件无效或缺失时,您应该实现错误处理。

upload.html

  <form action="/upload/" 
        method="post" 
        enctype="multipart/form-data" 
        class="dropzone" 
        id="dropzone">
    {% csrf_token %}
    <div class="fallback">
      <input name="file" type="file"/>
      <input type="submit"/>
    </div>
  </form>
  {% if content %}
  <table>
  {% for row in content %}
    <tr>
    {% for col in row %}
      <td>{{ col }}</td>
    {% endfor %}
    </tr>
  {% endfor %}
  </table>
  {% endif %}

我已经添加了一个&#39;提交&#39;按钮所以这没有dropzone的东西。我还删除了多个&#39;从文件输入,以保持示例简单。如果模板从解析的csv接收内容,那么最后会有一个表。但是当使用dropzone.js时,你必须使用javascript回调函数来显示表。