Как прочитать файл из ajax-вызова в Django?
Я работаю в 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;
    })
})
Урл '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'
Я не знаю, что здесь происходит. Если кто-то может помочь мне распечатать таблицу, я буду очень признателен. Печать на другой странице - это нормально, я просто не могу распечатать ее вообще.
Для получения файлов из запроса вы можете сделать что-то вроде этого.
form = forms.UploadFileForm(request.POST, request.FILES or None)
Я решил эту проблему, используя JQuery и изменив кучу вещей в ajax вызове:
 Запустите вызов, когда форма будет отправлена, и используйте e.preventDefault(), чтобы остановить ее от фактической отправки.
 Отправка формы в Django внутри объекта FormData.
 Использование processData: false и contentType: false.
Вот полный вызов Ajax:
$("#formulario").submit(function(e){
    e.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);
        }
    })
});