2012-10-05 66 views
5
$.ajax({ 
    url:'/', 
    type: "POST", 
    data: {name: 'name', age: 'age'}, 
    success:function(response){}, 
    complete:function(){}, 
    error:function (xhr, textStatus, thrownError){} 
}); 

而且在views.py:Django的jQuery的POST请求

class SomeView(generic_views.TemplateView): 
    template_name = 'something.html' 

    def get(self, request, *args, **kwargs): 
     ...something... 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     name = request.POST['name'] 
     age = request.POST['age'] 
     ...something... 

我也得到:[05月/ 10月/ 2012 12时03分58秒] “POST /事/ HTTP/1.1” 403 2294

我想通过jQuery来发送这个数据(姓名和年龄)这个帖子功能“SomeView”。这与加载模板的视图相同,只是请求类型不同。在get()模板加载后,应该调用post()函数。可能吗?我检查了其他问题并获得了此解决方案。它应该是工作。我究竟做错了什么?

回答

8

回答你的问题,你在做什么错,是: 不多!

Django的返回403响应(禁止)如果传入的POST请求失败CSRF检查。 您可以通过jQuery的ajaxSetup做到这一点,代码片段被发现here

,这并在GET请求工作的原因,很简单,就是GET请求不被CSRF中间件检查。

,因为它似乎你在这里建设一个形式,另一件事是使用基于类的形式考虑。他们处理get/post以及参数验证。井井有条。特别是当您编辑窗体来编辑/创建/删除模型实例时,在这种情况下,您可以拥有ModelForms和CreateViews的强大功能。井井有条。

可能需要一些时间才能获得这些通用的基于类的视图。但它非常值得。

+0

对我使用FormView的其他网站。但在这种情况下,我不能(长话短说)。 :) 现在的事情,但在终端,我看到 [05/Oct/2012 15:08:11]“POST /东西/ HTTP/1.1”500 9499 – premik91

+0

500只是一个服务器错误。这可能是由于你的post方法中的任何python错误。 –

+0

但是,应该显示,因为我处于调试模式,不应该吗? – premik91

6

你需要在你的Ajax调用一个CSRF(跨站请求伪造)令牌。这也记录在这里:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

,或者,如果你想用速战速决,使用@csrf_exempt装饰你的观点:

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    ... 
+0

谢谢:)男人呀 – premik91

2

在Django模板,你可以添加这个...

{% csrf_token %} 

将输出这样的事情在您的网页的HTML ...

<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz"> 

然后使用Javascript,你可以简单地找到这个输入并获得它的值 - 类似这个非jQuery示例...

var el = document.getElementsByName("csrfmiddlewaretoken"); 
csrf_value = el[0].getAttribute("value"); 

最后添加c srf_value像这样你的jQuery的AJAX后表单数据线...

data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value}, 

这里有一个工作的jsfiddle概念:https://jsfiddle.net/vdx1Lfpc/18/