以djangoforms从AJAX获取POST数据

我将在Django中获取参数forms的AJAX请求,这就是我正在做的事情:

base.html文件:

{% csrf_token %} First name:

main.js:

 $(document).ready(function(){ $("#register").live("click", function(e){ $.post("/", { name: "MY TEXT", }); }); }); 

views.py:

 from django.shortcuts import render_to_response from django.template import RequestContext from django.core.context_processors import csrf def home(request): if request.method == 'POST': print request.POST['name'] return render_to_response('registration.html', {}, context_instance=RequestContext(request)) 

是的,我知道此时我的JS没有从文本表单中获取真实数据,它只发送一个静态文本“MY TEXT”。 但是当我按下按钮时,我得到“MultiValueDictKeyError at /”密钥’name’在“”中找不到

我做错了什么?

我改变了我的代码:main.js

 $(document).ready(function(){ $("#register").live("click", function(e){ e.preventDefault(); $.post("/", { name:'MY TEXT' }); }); }); 

base.html文件:

 
{% csrf_token %} First name:

它有效 ,谢谢!

虽然,我有两个问题:

  1. 在这种情况下,我在哪里发送“我的文字”? 我发送它从名称字段返回ACTUAL数据并且不返回“我的文本”
  2. 该页面仍在重新加载。 我想把它完全变成AJAX。 我的意思是创建一个python函数,将数据从POST请求添加到MySQL数据库,并返回AJAX脚本操作的结果。 没有页面重新加载的一切。 我怎样才能做到这一点?

发生的事情是您没有阻止浏览器的默认submit操作发生。 所以你的Ajax POST已经完成,但随后浏览器本身就会发布POST – 而且正如Michal所指出的那样,你的表单不包含name字段,因此查找失败了。

你需要做两件事来解决这个问题。 首先,使用e.preventDefault(); 在你的JS点击方法中。 其次,检查视图顶部的request.is_ajax()

防止表单提交“e.preventDefault()”。 此外,最好是在用户点击Enter而不是点击的情况下绑定到表单:

base.html文件

 
{% csrf_token %} First name:

main.js

 $(document).ready(function(){ $("#register").live("submit", function(e){ $.post("/", { name: "MY TEXT", }); e.preventDefault(); }); }); 

我想问题是你没有在html中命名文本输入:

  

我认为应该是

 $.post("../save_note/", { data:'name=MY TEXT' }); 

 if 'name' in request.POST: 

您可以设置更强大的表单提交function来执行相同的操作,而不是使用单击处理程序。 返回false会取消默认提交行为。

 $("form").submit(function() { $.post("/", { name: "MY TEXT", }); return false; });