python - 如何从 Django 中的 ajax 调用中读取文件?
问题描述
我在 Django 工作。我需要上传一个 txt 文件并将其内容打印在表格中。我尝试了很多东西,但没有一个有效。有人建议我只在 ajax 调用中打印表格,但它不起作用。这是我正在尝试的:
我正在显示一个表格来上传文件:
class UploadFileForm(forms.Form):
file = forms.FileField(label = "File:")
我在视图中返回表单:
def upload(request):
form = UploadFileForm()
return render(request, 'upload.html', {'form': form})
我在模板中打印表格:
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
</form>
然后我有一个按钮来确认上传:
<button id="upload">Upload file</button>
这里是我尝试在 fetch 中打印表格的地方,但这是行不通的:
var upload = document.getElementById("upload");
upload.addEventListener("click", function(){
const url = "{% url 'table' %}";
fetch(url, {method:'POST'}).then(response => response.json()).then(function(data){
var table = document.getElementById('table');
tableRow1.innerHTML = data.tableHTML;
})
})
url 'table' 转到这个函数:
def table(request):
data = file_to_HTML(request.FILES['file'])
json_response = {"tableHTML":data}
return JsonResponse(json_response)
这里的问题是表格根本没有打印,我收到以下错误:
Internal Server Error: /table/
Traceback (most recent call last):
File "C:\Users\Daniel\miniconda3\envs\env1\lib\site-packages\django\utils\datastructures.py", line 78, in __getitem__
list_ = super().__getitem__(key)
KeyError: 'file'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\Daniel\miniconda3\envs\env1\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Users\Daniel\miniconda3\envs\env1\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Users\Daniel\miniconda3\envs\env1\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Daniel\miniconda3\envs\env1\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:\Users\Daniel\Trabajo\module1\app1\views.py", line 22, in table
data_list = read_bank_file(request.FILES['file'])
File "C:\Users\Daniel\miniconda3\envs\env1\lib\site-packages\django\utils\datastructures.py", line 80, in __getitem__
raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'file'
我不知道这里发生了什么。如果有人可以帮我打印表格,我将不胜感激。在不同的页面打印它很好,我根本无法打印它。
解决方案
我通过使用JQuery并在 ajax 调用中更改了一堆东西来解决它:
- 表单提交时触发调用,event.preventDefault()
用于阻止表单实际提交。
- 将表单发送到FormData
对象内的 Django。
- 使用processData: false
和contentType: false
。
这是完整的 Ajax 调用:
$("#formulario").submit(function(event){
event.preventDefault();
var formData = new FormData(this);
$.ajax({
url : "{% url 'table' %}",
type: "POST",
processData: false,
contentType: false,
data: formData,
success: function (data){
$("#tableData").append(data.tableHTML);
}
})
});
推荐阅读
- javascript - 如何在vscode中添加属性intellisense
- cloud-foundry - How to obtain output files from cloudfoundry that deployed application has created?
- java - 垃圾收集器可以调用多少次?
- sql - Left Join 不适用于 GROUP BY 和 WHERE 子句
- jenkins - 如何在 Jenkins Pipeline 中使用多个工具
- javascript - 从 SelectBox 中获取值
- html - 帮助页脚html css
- mongodb - MongoDB 和 WiredTiger 兼容性问题
- macos - 为什么 Mac OS X (10.15.7) 上的联系人使用 CPU 的全部功能?
- swift - 如何在 iOS 中实现 alpha 渐变效果