Django上传的文件无法处理

时间:2020-10-27 11:13:09

标签: python python-3.x django pandas

我正在构建一个Django Web应用程序,用户需要在其中上传文件。该文件应通过机器学习的语言进行搜索,然后结果将显示在另一个页面上。

现在,如果我为每个功能都显示文本字段,则可以使用,但是当我要上传一个csv文件(该csv文件称为test.csv)时,将其放在pandas数据框中,结果页将不会显示,并且看起来就像没有处理csv文件一样。

应该执行的操作是如果文件已上传,则将上传的文件保留在内存中进行处理,并在结果页面上返回输出。

HTML

{% extends "base.html" %}
{% block content %}
  <div class="content">
    <div class="row">
      <div class="col-lg-4">
        <div class="card card-tasks">
          <h1> </h1>
          <form action="{% url 'result' %}">
            {% csrf_token %}

            <p>temp_normal:</p>
            <input class="form-control" type="text" name="temp_normal">
            <br>

            <p>hour:</p>
            <input class="form-control" type="text" name="hour">
            <br>

            <p>hour_x:</p>
            <input class="form-control" type="text" name="hour_x">
            <br>

            <p>hour_y:</p>
            <input class="form-control" type="text" name="hour_y">
            <br>

            <input class="form-control" type="submit" value='Submit'>
          </form>
        </div>
      </div>
      <div class="col-lg-4">
        <div class="card card-tasks">
          <form action="{% url "result" %}" method="POST" enctype="multipart/form-data" class="form-horizontal">
            {% csrf_token %}
            <div class="form-group">
              <label for="name" class="col-md-3 col-sm-3 col-xs-12 control-label">File: </label>
              <div class="col-md-8">
                  <input type="file" name="csv_file" id="csv_file" required="True" class="form-control">
              </div>
            </div>
            <div class="form-group">
              <div class="col-md-3 col-sm-3 col-xs-12 col-md-offset-3" style="margin-bottom:10px;">
                   <button class="btn btn-primary"> <span class="glyphicon glyphicon-upload" style="margin-right:5px;"></span>Upload </button>
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  </div>
{% endblock content %}

views.py

def handle_uploaded_file(f):
    with open('test.csv', 'wb+') as destination:
        for chunk in f.chunks():
            destination.write(chunk)


# custom method for generating predictions
def getPredictions(data):
    import pickle
    model = pickle.load(open("test_model.sav", "rb"))
    prediction = model.predict(data)
    return prediction


@login_required
def result(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
            data = form
            data = pd.read_csv(data,header=0)
            result = getPredictions(data)
            return render(request, 'result.html', {'result': result})
    else:
        form = UploadFileForm()
    return render(request, 'index.html', {'form': form})

1 个答案:

答案 0 :(得分:0)

尝试:

  <form action="{% url "result" %}" method="POST" enctype="multipart/form-data" class="form-horizontal">
    {% csrf_token %}
    <div class="form-group">
      <label for="name" class="col-md-3 col-sm-3 col-xs-12 control-label">File: </label>
      <div class="col-md-8">
        {{ form }}
      </div>
    </div>
    <div class="form-group">
      <div class="col-md-3 col-sm-3 col-xs-12 col-md-offset-3" style="margin-bottom:10px;">
        <button class="btn btn-primary" type="submit"> <span class="glyphicon glyphicon-upload" style="margin-right:5px;"></span>Upload </button>
      </div>
    </div>
  </form>

如我们所讨论的那样:

@login_required
def result(request):
    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            file = request.FILES['file']
            handle_uploaded_file(file)
            data = pd.read_csv(file,header=0)
            result = getPredictions(data)
            return render(request, 'result.html', {'result': result})
    else:
        form = UploadFileForm()
    return render(request, 'index.html', {'form': form})