1

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

base.html:

<form method="POST">{% csrf_token %}
First name: <input type="text">
<input type="submit" value="Register" id="register">
</form>

主.js:

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

视图.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 /“Key 'name' not found in”

我做错了什么?

我改变了我的代码: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>

它有效,谢谢!

虽然,我有两个问题:

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

5 回答 5

3

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

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

于 2012-05-30T11:39:33.840 回答
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();
    });
});
于 2012-05-30T11:50:25.937 回答
1

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

<input type="text" name="name">
于 2012-05-30T11:34:25.213 回答
0

我认为应该是

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

if 'name' in request.POST:
于 2012-05-30T11:44:44.490 回答
0

您可以设置一个更强大的表单提交函数来做同样的事情,而不是使用点击处理程序。返回 false 取消默认提交行为。

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

    return false;
});
于 2012-05-30T11:48:05.993 回答