Django jQuery发布请求

$.ajax({ url:'/', type: "POST", data: {name: 'name', age: 'age'}, success:function(response){}, complete:function(){}, error:function (xhr, textStatus, thrownError){} }); 

在views.py中:

 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 / Oct / 2012 12:03:58]“POST / something / HTTP / 1.1”403 2294

我想通过jQuery将这些数据(名称和年龄)发送到“SomeView”中的这个postfunction。 这与加载的模板的视图相同,只是请求类型不同。 在get()上加载模板,在post上,应该调用post()函数。 可能吗? 我已经检查了其他问题并得到了这个解决方案。 它应该是有效的。 我究竟做错了什么?

你的问题的答案你做错了,是:不多!

如果传入的POST请求未通过Csrf检查,Django将返回403响应(禁止)。 你可以通过jQuery的ajaxSetup来实现, 这里可以找到代码片段

这个DOES在GET请求上工作的原因很简单,就是csrf中间件不会检查GET请求。

由于您似乎正在构建表单,因此需要考虑的另一件事是使用基于类的表单。 他们为您处理get / post以及参数validation。 井井有条。 特别是在制作表单来编辑/创建/删除模型实例时,在这种情况下,您可以拥抱ModelForms和CreateViews的强大function 。 井井有条。

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

您需要在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): ... 

在Django模板中,您可以添加此…

 {% csrf_token %} 

哪个会输出这样的内容到你的页面html …

  

然后使用Javascript,您可以简单地找到此输入并获取其值 – 类似于这个非jQuery示例…

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

最后将csrf_value添加到jQuery AJAX post表单数据行中,如下所示…

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

这是一个有效的jsFiddle概念: https ://jsfiddle.net/vdx1Lfpc/18/