【问题标题】:django-import-export outside admindjango-import-export 外部管理员
【发布时间】:2016-01-12 09:05:53
【问题描述】:

我正在尝试使用 django-import-export 实现一个简单的 xls 文件导入并保存到模型中。 不幸的是,文档只涵盖了管理员集成。 我被困在我的示例代码中:

class UploadFileForm(forms.Form):
    file = forms.FileField()


class ExportSpec(resources.ModelResource):
    class Meta:
        model = Specialty

view:
def ca_import(request):
    if request.method == 'POST' and 'import_test' in request.POST:
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            filehandle = request.FILES['file']
            dataset = ???
            result = ExportSpec().import_data(dataset, dry_run=False,
                                          raise_errors=True,
                                          user=request.user)

了解这个模块的人可以帮我完成这个通用示例的代码吗?

或者是否有一个通用的例子在网上某处被我使用谷歌没有找到?

编辑:

根据 Alex 的回答,我找到了可行的解决方案:

def ca_import(request):
    if request.method == 'POST' and 'import_test' in request.POST:
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            file = form.cleaned_data['file']
            data = bytes()
            for chunk in file.chunks():
                data += chunk
            dataset = XLS().create_dataset(data)
            result = ExportSpec().import_data(dataset, dry_run=False, raise_errors=True, user=request.user)

【问题讨论】:

  • 到目前为止,代码看起来还不错。您遇到了什么样的错误,或者您面临什么具体问题?
  • 请参见“dataset = ???”行。我相信我必须从文件句柄中获取数据集。

标签: python django django-import-export


【解决方案1】:

您应该使用Format.create_dataset() 方法:

from import_export.formats.base_formats import XLS

def your_view():
    filehandle = form.cleaned_data['file']
    data = bytes()
        for chunk in import_file.chunks():
            data += chunk
    dataset = XLS().create_dataset(data)
    result = ExportSpec().import_data(...)

【讨论】:

  • 我试过了,我得到一个错误,'filehandle.content' 'ExcelInMemoryUploadedFile' object has no attribute 'content'
  • 对不起,我只是没有安装django-import-export,所以可能需要一些时间才能达到目标)。如果您尝试表单的file 字段会怎样?查看更新后的答案。
  • 您的回答将我引向了正确的方向。我查看了模块的源代码,并在上面的编辑中生成了代码行。也许有一种更简单的方法,但这很有效。
  • 太棒了,我已经更新了答案,所以它包含了经过测试的代码。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2023-03-28
相关资源
最近更新 更多