【问题标题】:Uploading and processing a csv file in django using ModelForm使用 ModelForm 在 django 中上传和处理 csv 文件
【发布时间】:2018-05-09 13:11:36
【问题描述】:

我正在尝试从用户上传的 csv 文件中上传和获取数据。我正在使用以下代码。 这是我的 html 表单(upload_csv1.html):

    <form action="{% url 'myapp:upload_csv' %}" method="post" enctype="multipart/form-data">
    {% csrf_token %}
    <input type="file" name="csv_file1">
    <input type="submit" value="Upload">
</form>

这是views.py:

def uploadcsv(request):
data = {}
if "GET" == request.method:
    return render(request, "myapp/upload_csv1.html", data)
# if not GET, then proceed
try:
    csv_file = request.FILES["csv_file1"]
    if not csv_file.name.endswith('.csv'):
        messages.error(request,'File is not CSV type')
        return HttpResponseRedirect(reverse("myapp:upload_csv"))
    #if file is too large, return
    if csv_file.multiple_chunks():
        messages.error(request,"Uploaded file is too big (%.2f MB)." % (csv_file.size/(1000*1000),))
        return HttpResponseRedirect(reverse("myapp:upload_csv"))

    file_data = csv_file.read().decode("utf-8")

    lines = file_data.split("\n")
    #loop over the lines and save them in db. If error , store as string and then display
    for line in lines:
        fields = line.split(",")
        data_dict = {}
        data_dict["sku"] = fields[0]
        data_dict["item_name"] = fields[1]
        try:
            form = PalazzoForm(data_dict)
            if form.is_valid():
                form.save()
            else:
                logging.getLogger("error_logger").error(form.errors.as_json())                                                
        except Exception as e:
            logging.getLogger("error_logger").error(form.errors.as_json())                    
            pass

except Exception as e:
    logging.getLogger("error_logger").error("Unable to upload file. "+repr(e))
    messages.error(request,"Unable to upload file. "+repr(e))

return HttpResponseRedirect(reverse("myapp:upload_csv"))

代码运行良好。

我无法得到的是,当我在视图中打印 request.method 时

def uploadcsv(request):
    print request.method

输出是“GET”而不是“POST”。

我的怀疑是,

  1. 如果 request.method 是 GET 那么为什么代码没有跳过“try-except”块以及它是如何处理 csv 文件的?
  2. 当HTML表单方法设置为“post”时,为什么request.method显示为“GET”?

我一直在寻找thisthis(这与我的问题有某种关联),但这些问题没有最终答案。

我还尝试了通过键入正确的 URL 进行附加斜杠重定向,但 request.method 仍然是“GET”。

谁能澄清一下这个概念?

我使用的代码来自this

【问题讨论】:

    标签: python django csv


    【解决方案1】:

    您的代码运行良好。您可以尝试使用 pdb 对其进行调试。 您可能在加载页面时打印方法类型,而不是上传 .csv 文件。

    【讨论】:

    • 好的,你是对的,我在加载页面时检查了方法,这就是为什么它给了我“GET”。谢谢@prakash09
    【解决方案2】:

    第二个问题。

    当请求页面时,它总是发出 GET 请求: django runserver 在控制台运行时可以看到日志:

    [01/Jul/2000 18:11:12] "**GET** /some/url/path/ HTTP/1.1" 200 17521
    

    这样的条件句
    if request.method == "GET":
      print(True) 
    else:   
      print(False)
    

    将始终为 True,除非像带有 method="POST" 的 html 表单之类的东西发送 POST 请求。

    [23/Jul/2000 18:05:16] "**POST** /some/url/path/ HTTP/1.1" 200 9221
    

    在这种情况下,您必须期待 GET 请求(通过浏览器请求页面时)和 POST 请求(单击提交按钮时)。

    【讨论】:

      猜你喜欢
      • 2022-06-12
      • 2013-06-24
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      相关资源
      最近更新 更多