2014-08-29 118 views
0

我对AJAX很新,我做了一个简单的测试,看看我能否获得AJAX的工作。请求不起作用

如果我按下类似按钮,服务器应该增加1,并通过提醒用户响应最新的类似计数。

现在,我收到一条提示,说'错误'。它现在正在增加404

看起来像AJAX请求失败。这是为什么发生?

的index.html(局部的)

<div> 
    {{ cmt.body }}<br/> 
    <strong> 
     <span class="like_count" style="color:green">{{cmt.likes}}</span> 
     <button type="button" class="like_btn" data-cmt_id="{{ cmt.id }}">Like</button> 
    </strong> 
</div> 

views.py

def update_like(request): 
    if request.is_ajax(): 
     try: 
      cmt = Comment.objects.get(pk=int(request.POST['cmid'])) 
      cmt.likes += 1 
      cmt.save() 
     except KeyError: 
      return HttpResponse('Error') 

     return HttpResponse(cmt.likes) 

default.js(其中的index.html延伸base.html文件导入)

$(document).ready(function(){ 
     $('.like_btn').on('click', function(){ 
      var comment = $(this).attr('data-cmt_id'); 
      $.ajax({ 
       url: '/comment/update_like', 
       type: "POST", 
       data: { 
        cmid: comment 
       }, 
       success: function(data){ 
        alert("!!"+data); 
       }, 
       error: function(){ 
        alert('error'); 
       } 
      }); 
     }) 
    }); 

加:::

urls.py

urlpatterns = patterns('', 
    (r'^$', index), 

    url(r'^admin/', include(admin.site.urls)), 

    url(r'^comment/update_like/$', update_like) 
) 
+0

不是方法名称是/ comment/update_like而不是/ comment/like? – SSA 2014-08-29 11:34:08

+0

哇..我是一个白痴....感谢您的注意:)但现在我得到一个弹出与'错误' – Dan 2014-08-29 11:36:31

+0

什么错误?编辑你的问题。 – SSA 2014-08-29 11:37:41

回答

0

好吧,我终于设法解决这个问题。

首先感谢mrcrgl。我四处寻找一个调试控制台,给了我详细的信息,并证明IE网络选项卡提供了广泛的细节:)

最初的问题是通过查看响应主体,这是一个错误页面不放在'/' js网址的结尾。

应该已经

url: '/comment/update_like/' 

不,

url: '/comment/update_like' 

在此之后,我得到了一个禁止403。快速谷歌搜索给了我这个

403 Forbidden error when making an ajax Post request in Django framework

原来这是失踪的CSRF令牌这是造成问题。 我只是说

@csrf_exempt 

我update_like视图的顶部和它的作品找到现在;)

0

因此改变URL的工作,因为它是一个后Ajax请求,但要么改变它来获取AJAX请求或者如果你想使用POST请求,传递csrf令牌是一个很好的概念。

所以,如果你想要的CSRF令牌在那里,这是很好的POST AJAX方法,那么你可以删除@csrf标签,并在你的Java脚本编写一个方法来获得CSRF令牌作为建议在这里

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

+0

是的。我知道这是一个很好的做法,使用csrf令牌,但在这种情况下,我只是想让ajax工作,因为它不会去prd – Dan 2014-08-30 16:00:03

+0

我很高兴它的工作,我曾经遇到同样的问题:)。你也可以尝试GET。 – user2195058 2014-08-30 16:02:18