【问题标题】:Django uploaded file doesn't processDjango上传的文件不处理
【发布时间】:2020-10-27 11:13:09
【问题描述】:

我正在构建一个用户需要上传文件的 Django 网络应用程序。该文件应经过机器学习算法,然后结果将显示在不同的页面上。

如果我为每个功能都提供了文本字段,现在它可以工作,但是当我想上传一个 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})

【问题讨论】:

  • 上传按钮上需要type="submit"吗?
  • 在我添加type="submit"后仍然无法正常工作
  • 尝试从上下文中添加您的表单 -> {{ form }} 而不是您的 html 文件输入

标签: python python-3.x django pandas


【解决方案1】:

尝试:

  <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})

【讨论】:

  • 由于这段代码,事情正在发生。但我遇到了一个错误Invalid file path or buffer object type: &lt;class 'djangoweek.forms.UploadFileForm'&gt;
  • 我认为这是因为熊猫不喜欢这个。 \venv\lib\site-packages\pandas\io\common.py, line 243, in get_filepath_or_buffer
  • 是的,我想说看起来像熊猫错误 - 需要看看你的腌制函数中有什么
  • 您的意思是选择的 .sav 文件?还是别的什么?
  • 是的,原来 *model 被腌制了
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2011-08-17
  • 2010-12-30
  • 2011-09-16
  • 2012-07-29
  • 2015-04-25
相关资源
最近更新 更多