我将在Django中获取参数形式的AJAX请求,这就是我正在做的事情:
base.html文件:
<form method="POST">{% csrf_token %}
First name: <input type="text">
<input type="submit" value="Register" id="register">
</form>
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 “密钥'名称'未在”
中找到我做错了什么?
我改变了我的代码: main.js
$(document).ready(function(){
$("#register").live("click", function(e){
e.preventDefault();
$.post("/", {
name:'MY TEXT'
});
});
});
base.html文件:
<form method="POST">{% csrf_token %}
First name: <input type="text" name="name">
<br>
<input type="submit" value="Register" id="register">
</form>
有效,谢谢!
虽然,我有两个问题:
答案 0 :(得分:3)
发生的事情是您没有阻止浏览器的默认submit
操作发生。所以你的Ajax POST已经完成,但随后浏览器本身立即发布 - 而且正如Michal所指出的那样,你的表单不包含name
字段,因此查找失败。
你需要做两件事来解决这个问题。首先,在JS click方法中使用e.preventDefault();
。其次,检查视图顶部的request.is_ajax()
。
答案 1 :(得分:2)
阻止表单提交“e.preventDefault()”。此外,如果用户点击Enter而不是点击:
,最好绑定到表单base.html文件
<form method="POST" id="register">{% csrf_token %}
First name: <input type="text">
<input type="submit" value="Register">
</form>
main.js
$(document).ready(function(){
$("#register").live("submit", function(e){
$.post("/", {
name: "MY TEXT",
});
e.preventDefault();
});
});
答案 2 :(得分:1)
我想问题是你没有在html中命名文本输入:
<input type="text" name="name">
答案 3 :(得分:0)
我认为应该是
$.post("../save_note/", {
data:'name=MY TEXT'
});
并且
if 'name' in request.POST:
答案 4 :(得分:0)
您可以设置更强大的表单提交功能来执行相同的操作,而不是使用单击处理程序。返回false会取消默认提交行为。
$("form").submit(function() {
$.post("/", {
name: "MY TEXT",
});
return false;
});