1

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",
        });
    });
});

ビュー.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>

それはうまくいきます、ありがとう!

ただし、次の 2 つの質問があります。

  1. この場合、「MY TEXT」はどこに送信されますか? 名前フィールドから実際のデータを返し、「MY TEXT」を返しません
  2. ページはまだリロード中です。そして、それを完全に AJAX にしたかったのです。POSTリクエストからMySQLデータベースにデータを追加するPython関数を作成し、操作の結果をAJAXスクリプトに返すことを意味します。そして、ページのリロードなしですべて。これどうやってするの?
4

5 に答える 5

3

何が起こっているかというと、ブラウザのデフォルトsubmitアクションの実行を妨げていないということです。したがって、Ajax POST は完了しますが、すぐにブラウザー自体が POST します。Michal が指摘するように、フォームにはnameフィールドが含まれていないため、ルックアップは失敗します。

これを修正するには、2 つのことを行う必要があります。まず、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

クリック ハンドラーを使用する代わりに、より堅牢なフォーム送信機能をセットアップして同じことを行うことができます。false を返すと、デフォルトの送信動作がキャンセルされます。

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

    return false;
});
于 2012-05-30T11:48:05.993 に答える
0

そうあるべきだと思う

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

if 'name' in request.POST:
于 2012-05-30T11:44:44.490 に答える