[Django]views中视图函数获取不到form表单提交的文件,request.FILES为空

问题描述:

        html代码为;

 <form action="/datasets.html" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        <input class = "row" type = "file" >
      <p> <button type ="submit">上传文件</button></p>
</form>

 然后视图函数的代码为:

def datasets(req):
    #req =  HttpRequest(req)
    if(req.method == "POST"):
        print(req.FILES)
        print(req.POST)
       
    return render(req,'datasets.html')

结果我提交了一个txt文件后,后台打印情况如下:

 可以看出,后台确实收到了POST的提交,但是获取的request.FILES为空。

我查询了非常多文档和博客,但是大多数解决办法都是设置enctype,input标签type设置为file,设置csrf_token之类的。然而这些我都已经照做了。。。。

原因和解决办法:

input标签没有设置name属性!!

设置一下name:

然后看看结果:

成功!

但是为啥没设置name就不会 获取到呢?

因为name属性用于对提交到服务器后的表单数据进行标识,或者在客户端通过 JavaScript 引用表单数据。一个控件是否设置它的 name 属性是不会影响到这个网页的功能实现的。但是,当我们需要把这个控件所关联的数据传递到数据库时,就必须要设置 name 属性。

从打印的结果来看也好理解:数据结构是一个字典,我们设置的name成为了字典的key,上传的数据(文件)成为了字典项的value,如果我们不设置name那么就没有办法设置item.key那自然没办法获取数据了。

 总结:

如果不注意细节,写代码会花费更多的时间。

猜你喜欢

转载自blog.csdn.net/HowToPause/article/details/127328028
今日推荐