问题描述:
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那自然没办法获取数据了。
总结:
如果不注意细节,写代码会花费更多的时间。