【问题标题】:Django - is_ajax() not returning trueDjango - is_ajax() 不返回 true
【发布时间】:2014-05-30 13:18:12
【问题描述】:

我知道已经有很多关于这个问题的问题,但我无法解决它。请看:

当按下“更新”按钮时,从配置文件视图中我希望用户显示一个可编辑的表单,其中的值是从数据库中挑选的。所以到目前为止还没有 POST 数据。

模板:

<form id="shw-form" action="/update_user_profile/{{r_user.id}}" method="get" enctype="multipart/form-data">
<button type="submit" id="upd-btn"  class="btn btn-lg btn-warning" onclick="update_profile_page();">UPDATE</button>
</form>

jquery:

<script type="text/javascript">
    function update_profile_page() {


            var form = $("#shw-form");
            $("#upd-btn").attr('disable', 'true');
            $.ajax({
                url: form.action,
                type: 'get',
                success: function(response){
                    $("#upd-main").load(response); 
                }
                });

            return false;

    }
   </script> 

urls.py

url(r'^update_user_profile/(?P<user_id>\d+)$', 'myapp.views.update_user_profile', name='update_user_profile')

但是当我点击按钮时 is_ajax() 的 else 部分被执行。

如果您能找到我做错或遗漏的任何内容,请查看。谢谢。

【问题讨论】:

  • 您访问表单的action 不正确。你应该这样做 form.attr('action') 因为 form 是 jQuery 对象。

标签: jquery python ajax django


【解决方案1】:

is_ajax() 检查X-REQUESTED-WITH 标头。通常jQuery 会正确设置它。您可以尝试在$.ajax 中显式设置此标头:

$.ajax({
   url: form.action,
   type: 'get',
   success: function(response){
      $("#upd-main").load(response); 
   },
   headers: {
     'X-Requested-With': 'XMLHttpRequest'
   }
});

如果这不起作用,则意味着您的服务器或代理删除了此标头。

【讨论】:

  • 我试过了,还是不行。我已经在 Firefox-29.0.1 和 IE-10 中尝试过。有解决办法吗?
  • 首先看看我对form.action的评论,也许它会有所帮助。接下来,您应该检查浏览器是否确实发送了此标头(例如使用 Firebug)。如果是,则问题出在服务器端
  • 我已按照您的建议更改了 'url:',这是 firefox 对 header 的评价:
  • 接受 text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Encoding gzip, deflate Accept-Language en- US,en;q=0.5 Connection keep-alive Cookie 127.0.0.1:8000/user_profile/1 User-Agent Mozilla/5.0 (Windows NT 6.2; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
  • 你改变了什么'url:'?
【解决方案2】:

不要使用按钮的 onclick 属性,它可能无法捕获所有内容。请改用 jQuery 的 submit() 事件处理程序 (http://api.jquery.com/submit/)。如果您在控制台中没有看到任何请求,那么 Daniel 很可能是对的:表单以通常的方式提交。

【讨论】:

    【解决方案3】:

    您没有禁用按钮的默认操作,因此浏览器正在提交表单。

    由于您已将 JS 函数显式放入 HTML onclick 中,因此您可以这样做:

    <button ... onclick="update_profile_page();return false;"
    

    【讨论】:

    • 我试过了,但现在按钮在点击时没有任何作用。
    • 您解决了form.action 问题吗?我认为这是阻止请求的唯一原因
    • @Daniel 我已按照建议对其进行了更改,但即使在我成功定向到 url 之前,它只是 is_ajax() 返回 false。因此,更改后问题仍然存在。
    • @Daniel 有什么建议吗?
    • 不要使用按钮的onclick属性,它可能无法捕获所有内容。请改用 jQuery 的 submit() 事件处理程序 (api.jquery.com/submit)。如果您在控制台中没有看到任何请求,那么 Daniel 很可能是对的:表单是按常规方式提交的。
    猜你喜欢
    • 2014-01-05
    • 2020-12-17
    • 2018-07-06
    • 2019-09-07
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    相关资源
    最近更新 更多