【问题标题】:How to submit Form using Ajax in Django如何在 Django 中使用 Ajax 提交表单
【发布时间】:2018-09-17 23:42:28
【问题描述】:

我正在尝试使用 Ajax 提交 HTML Form,但我没有收到任何成功或失败的警报。

index.html

<form method="post" class="needs-validation" enctype="multipart/form-data"  action="/upload/" id="fupload">

    <div class="custom-file">
        <input type="file" class="custom-file-input" id="data_files" name="data_files" multiple required>
        <label class="custom-file-label" for="data_files">Choose files</label>
    </div>

    <button type="submit">Upload files</button>

</form>

<script type="text/javascript">
    var frm = $('#fupload');
    frm.submit(function () {
        $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            success: function (data) {
                alert('Form Submitted');
            },
            error: function(data) {
                alert('Form submission failed');
            }
        });
        return false;
     });

views.py

@csrf_exempt
def upload(request):
    if request.method == 'POST':
        return HttpResponse()

任何猜测为什么它不起作用

【问题讨论】:

  • 尝试在 AJAX 函数中删除 return false; 看看是否有效?
  • 我认为问题在于action='/upload/',它将在urls.py 中寻找upload。您需要它来运行 javascript,但它永远不会到达那里。

标签: python ajax django forms


【解决方案1】:

尝试更改以下内容:

  • 删除action
  • 将按钮改为type="button"并添加事件监听器

    <form method="post" class="needs-validation" id="fupload">
    
        <div class="custom-file">
            <input type="file" class="custom-file-input" id="data_files" name="data_files" multiple required>
            <label class="custom-file-label" for="data_files">Choose files</label>
        </div>
    
        <button type="button" id="upload-files-btn">Upload files</button>
    </form>
    
    <script type="text/javascript">
        var frm = $('#fupload');
        var btn = $('#upload-files-btn');
        btn.bind('click', handleClick);
        var formData = new FormData(); // Use FormData instead
        formData.append('file', frm.files[0], frm.files[0].name) // The first argument is the 'key' of the form data so change it to whatever works.
        var handleClick = function (event) {
            event.preventDefault();
            $.ajax({
                type: frm.attr('method'),
                url: '/upload/',
                data: formData,
                contentType: false,  // add this to indicate 'multipart/form-data'
                success: function (data) {
                    alert('Form Submitted');
                },
                error: function(data) {
                    alert('Form submission failed');
                }
             });
        }
    </script>
    

【讨论】:

  • 我尝试了你的方法,但由于某些原因它没有奏效
  • 我在浏览器控制台上收到此错误Uncaught TypeError: btn.addEventListener is not a function
  • 我的错,对于 jQuery,你会使用 bind() 代替。我已经更新了答案
  • 还是不行。以前的错误已解决,但当我单击按钮时似乎没有发生任何事情。
  • 您可以尝试在 AJAX 调用之前在 handleClick 函数中添加 console.log() 以查看侦听器是否正常工作?
猜你喜欢
  • 2017-07-26
  • 2021-03-19
  • 2019-03-24
  • 1970-01-01
  • 2019-01-08
  • 2011-03-13
  • 2020-11-24
  • 2015-12-21
  • 1970-01-01
相关资源
最近更新 更多