【问题标题】:How can I read a file from ajax call in Django?如何从 Django 中的 ajax 调用中读取文件?
【发布时间】:2021-11-22 22:37:11
【问题描述】:

我在 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'

我不知道这里发生了什么。如果有人可以帮我打印表格,我将不胜感激。在不同的页面打印它很好,我根本无法打印它。

【问题讨论】:

    标签: python django ajax


    【解决方案1】:

    我通过使用 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);
            }
        })
    });
    

    【讨论】:

      【解决方案2】:

      要从请求中获取文件,您可以执行以下操作。

      更新

      def get_file_data_from_ajax(request):
          if not request.is_ajax():
              return BadRequest
      
          form = forms.UploadFileForm(request.POST, request.FILES or None)
          if not form.is_valid():
              return BadRequest
      
          info_form = form.save(commit=False)
          info_form.user = request.user if requset.user.is_authenticated else None
          info_form.is_active = True
          info_form.save(commit=True)
      
          return JsonResponse({'status':'form is valid'})
      

      【讨论】:

      • 我把那个放在哪里?
      • 在你的views.py文件中。
      • 你能再具体一点吗?
      • 我更新了答案,希望对您有所帮助。
      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2018-08-18
      • 2014-04-21
      • 2017-05-08
      • 1970-01-01
      相关资源
      最近更新 更多