【问题标题】:How to upload csv file using django project如何使用 django 项目上传 csv 文件
【发布时间】:2015-12-20 15:54:11
【问题描述】:

我正在尝试在 django 中创建文件上传。

inventory.html:

我有两个按钮download_inventory 按钮下载一个 csv 文件。我正在尝试使用upload_inventory 按钮上传文件。

<form method="POST" action="{% url 'bulkInventory' %}">
    {% csrf_token %}
        <div class="panel-body">
            <div class="pad-btm form-inline">
                <div class="row">
                    <div class="col-sm-6 table-toolbar-left">
                        <button name="download_inventory" id="download_inventory" class="btn btn-purple btn-labeled fa">Download Inventory</button>
                        &nbsp;&nbsp;
                        <input type="file" class="btn btn-purple" name="inventory_csv" >
                        &nbsp;&nbsp;
                        <button name="upload_inventory" id="upload_inventory" class="btn btn-purple btn-labeled fa dropzone" >Upload Inventory</button>
                    </div>
                    .....

urls.py:

方法bulkInventory 映射到动作bulkInventory

urlpatterns = patterns('',
                    url(r'^$', views.inventory, name='inventory'),
                    url(r'^product.html/', views.product, name='product'),
                    url(r'^update/', views.updateSingle, name='update'),
                    url(r'^inventory/', views.bulkInventory, name='bulkInventory'),)

views.py:

def bulkInventory(request):
    api = APIMethods()
    if request.method == 'POST' and 'download_inventory' in request.POST:
        api.downloadInventory()
        inv_file = open('inventory_sheet.csv', 'rb')
        response = HttpResponse(inv_file, content_type='application/csv')
        response['Content-Disposition'] = "attachment; filename=inventory_sheet.csv"
        os.system('rm inventory_sheet.csv')
        return response

    if request.method == 'POST' and 'upload_inventory' in request.POST:
        form = forms.UploadFile(request.POST, request.FILES)
        print form.is_valid()
        api.saveUploadedInventory(request.FILES['inventory_csv'])    #  this method saves the content of file
        return HttpResponseRedirect(reverse('inventory'))

forms.py:

class UploadFile(forms.Form):
    inventory_file = forms.FileField()

它给了我这个错误:

追溯:文件 “/home/manish/syserp/local/lib/python2.7/site-packages/django/core/handlers/base.py” 在 get_response 中 132.

response = Wrapped_callback(request, *callback_args, **callback_kwargs) bulkInventory 中的文件“/home/manish/syserp/ekomerz/inventory/views.py” 78. api.saveUploadedInventory(request.FILES['inventory_csv']) 文件“/home/manish/syserp/local/lib/python2.7/site-packages/django/utils/datastructures.py” 在 getitem 中 322. 引发 MultiValueDictKeyError(repr(key))

异常类型:MultiValueDictKeyError at /product/inventory/ 异常值:“'inventory_csv'”

【问题讨论】:

  • 缺少
    ?
  • @chfw 仍然遇到同样的错误
  • 使用 'inventory_file' 作为键而不是 'inventory_csv'。
  • 如果我将使用inventory_file 作为键,文件输入元素将如何在方法中被引用?我用了它,但它仍然抛出同样的错误。
  • UploadFile 将inventory_file 作为键,但在您的html 表单中它被命名为inventory_csv。为避免这种情况,您可以执行 form = UploadFile() 然后在您的 html 模板中,放置这一行 {{ form.as_table }}。

标签: python html django csv


【解决方案1】:

form.is_valid()之后你为什么不去form.cleaned_data[''inventory_csv]

在此之前检查您要打印的内容form.cleaned_data['inventory_csv']

希望对你有帮助

【讨论】:

  • inv_file = form.cleaned_data['inventory_csv']。这样做给我这个错误:异常类型:AttributeError at /product/inventory/ 异常值:'UploadFile'对象没有属性'cleaned_data'
  • 这意味着您的表单无效
  • 如果 request.method == "POST": form = UploadFile(request.POST, request.FILES) if form.is_valid(): inv_file = form.cleaned_data['inventory_csv']
  • 我做到了。当我print form.is_valid() 时它说假。我已经包含了forms.py。如何纠正错误?
  • 如果您从表单上传了 csv 文件,您的表单应该可以工作。并且您上传的文件没有损坏。如果它不起作用,请尝试更改表单和视图的类名。我曾经遇到过同样的问题,它解决了我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2014-09-02
相关资源
最近更新 更多