python - 如何从 Django 中的 ajax 调用读取文件?

标签 python django ajax

我在 Django 中工作。我需要上传一个txt文件并将其内容打印在表格中。我尝试了很多方法,但没有一个有效。有人建议我只在 ajax 调用中打印表格,但它不起作用。这是我正在尝试的:

我正在显示一个用于上传文件的表单:

class UploadFileForm(forms.Form):
    file = forms.FileField(label = "File:")

我正在 View 中返回表单:

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>

这是我尝试在获取中打印表格的地方,但它不起作用:

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: falsecontentType: 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);
        }
    })
});

关于python - 如何从 Django 中的 ajax 调用读取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69403181/

相关文章:

python - 如何在 tastypie 中使用 DjangoAuthorization() 限制对资源的 GET 访问

python - 如何防止 mod_wsgi Django 应用程序重复重新加载?

python - django 查看 session ID - 未登录的用户缺少

jquery ajax jsonp : this page is accessing information that is not under its control

javascript - 使用 AJAX 按自定义分类术语过滤 WordPress 帖子

python - 无法从 python-ldap 连接到 Windows Server 2016 上的 ldaps

python - 如何继续询问用户输入,直到认为输入有效?

python - pycharm - 将命令发送到 python 控制台时在编辑器中保持焦点

python - Ubuntu 找不到包含 __init__.py 的模块目录

javascript - 在 jQuery 中调用 Ajax 返回数据的 HTML 元素 ID