【问题标题】:Django - Import Export - Upload multiple filesDjango - 导入导出 - 上传多个文件
【发布时间】:2020-05-02 06:52:37
【问题描述】:

我正在使用 django import-export 模块,并且正在遵循此文档:

https://simpleisbetterthancomplex.com/packages/2016/08/11/django-import-export.html#importing-data


我想创建一个用户可以上传多个文件的上传页面。

这是我走了多远:


views.py

def upload_data(request):
    if request.method == 'POST':
        wo_resource = WorkordersResource()
        pl_resource = PlantResource()
        se_resource = SeriesResource()
        re_resource = ResourcesResource()
        rd_resource = ResourceDemandsResource()
        dataset = Dataset()
        wo_data = request.FILES.get('workorders_key', None)
        pl_data = request.FILES.get('plants_key', None)
        se_data = request.FILES.get('series_key', None)
        re_data = request.FILES.get('resources_key', None)
        rd_data = request.FILES.get('resourcedemands_key', None)
        wo_imported_data = dataset.load(wo_data.read())
        pl_imported_data = dataset.load(pl_data.read())
        se_imported_data = dataset.load(se_data.read())
        re_imported_data = dataset.load(re_data.read())
        rd_imported_data = dataset.load(rd_data.read())
        wo_result = wo_resource.import_data(dataset, dry_run=True)
        pl_result = pl_resource.import_data(dataset, dry_run=True)
        se_result = se_resource.import_data(dataset, dry_run=True)
        re_result = re_resource.import_data(dataset, dry_run=True)
        rd_result = rd_resource.import_data(dataset, dry_run=True)
        if not wo_result.has_errors():
            wo_resource.import_data(dataset, dry_run=False)  
        elif not pl_result.has_errors():
            pl_resource.import_data(dataset, dry_run=False)  
        elif not se_result.has_errors():
            se_resource.import_data(dataset, dry_run=False)  
        elif not re_result.has_errors():
            re_resource.import_data(dataset, dry_run=False) 
        elif not rd_result.has_errors():
            rd_resource.import_data(dataset, dry_run=False) 
        else:
            print(result)
    return render(request,'import.html')

import.html

 <form class="importform" method="post" enctype="multipart/form-data"> {% csrf_token %}
        <div class="formlabel">
        <label class="uploadlabel">Workorders</label>
        <input class="uploadform" type="file" name="workorders_key" placeholder="Workorders">                
        </div>
        <div class="formlabel">
            <label class="uploadlabel">Plants</label>
            <input class="uploadform"  type="file" name="plants_key" placeholder="Plants">
        </div>
        <div class="formlabel">
        <label class="uploadlabel">Series</label>
        <input class="uploadform"  type="file" name="series_key" placeholder="Series">                
        </div>
        <div class="formlabel">
        <label class="uploadlabel">Resources</label>
        <input class="uploadform"  type="file" name="resources_key" placeholder="Resources">
        </div>
        <div class="formlabel">
        <label class="uploadlabel">Resource Demands</label>
        <input class="uploadform"  type="file" name="resourcedemands_key" placeholder="Resource Demands">                
        </div>
        <button type="submit" class="btn btn-primary">Upload</button>
      </form>

导入第一个文件的数据,不导入其他文件的数据。


谢谢

【问题讨论】:

  • 根据提交的表单,您将获得“myfile”或“mychart”作为文件的键 (request.FILES.get('myfile'))。所以根据哪一个,你只需实例化对应的ModelResource
  • 我需要为每个表单创建一个单独的上传视图并将request.FILES['KEY']关联到表单的对应键,对吧?
  • 不,你可以做一个视图。只是一个if ... else... 子句
  • 我将所有内容都打包在一个函数中,但这似乎不对
  • 如果字典中的键不存在,则无法使用下标访问该键。请改用get(),如果密钥不存在,它会返回Nonerequest.FILES.get('plants_key')。这是基本的python。或者,如果您不想要 None 而是默认使用空文件 request.FILES.get('plants_key', File())

标签: django django-import-export


【解决方案1】:

有一个依赖项更新破坏了 django-import-export。您只需要将 tablib 版本强制为 0.14.0。

django-import-export github 上有问题:#1064

【讨论】:

    【解决方案2】:

    您需要检查您上传的文件是否为 Null。 request.FILES 如果内容为空,会返回 key 错误。

    您需要使用request.FILES.get('file', &lt;default&gt;) 设置默认值,其中&lt;default&gt; 是另一个文件或None

    例如在您的代码中,如果我们将 None 作为默认值,则行:

    wo_data = request.FILES['workorders_key']
    pl_data = request.FILES['plants_key']
    se_data = request.FILES['series_key']
    re_data = request.FILES['resources_key']
    rd_data = request.FILES['resourcedemands_key']
    

    应该变成:

    wo_data = request.FILES.get('workorders_key', None)
    pl_data = request.FILES.get('plants_key', None)
    se_data = request.FILES.get('series_key', None)
    re_data = request.FILES.get('resources_key', None)
    rd_data = request.FILES.get('resourcedemands_key', None)
    

    【讨论】:

    • 添加了如何在您的代码中实现它的示例。
    • 现在我得到:'NoneType' 对象没有属性 'read' @pl_imported_data = dataset.load(pl_data.read())
    • 那是因为你上传的文件是空的。所以它试图读取无。在继续并更正文件上传之前,您需要进行一些错误处理。但是,我提到的这样做的方法是更安全的方法。
    • 我使用了你提出的方法,我为每个上传表单选择了一个文件,所以我不明白为什么它应该是空的
    • 我已经发布了表格
    猜你喜欢
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 2021-01-22
    • 2013-10-04
    • 2015-05-28
    相关资源
    最近更新 更多