6

私は Ajax と Django の初心者です。質問を簡単にするために、1 つの非表示のフォームと 2 つのオブジェクトがあり、ユーザーにオブジェクトの位置の一部をクリックするように依頼します。クリックするたびに、フォームの一部が入力されます。オブジェクトごとにフォームに 1 回入力する必要があります。だから全体で2倍。最初の件名のフォームが入力されたら、ページを更新せずに Ajax 経由でフォームをサーバーに送信し、2 番目のオブジェクトのフォームを再入力できるようにします。ただし、何らかの理由で、フォームを ajax 経由で送信することはできません。

これが私のコードです: index.html:

<html>
<body>
<script src="{{ STATIC_URL }}prototype.js"></script>
<script src="{{ STATIC_URL }}jquery.js"></script>
<script>

  objectID= 1;
  num_obj = {{num_obj}}

  function ajax_post(){
    $('#inputform').submit(function() {  
        $.ajax({ 
            type: 'POST',
            url: '/index/',
            data: $(this).serialize(),
            success: function(data){alert(data)}

         }); // end new Ajax.Request
    });
  }


 function onDocumentMouseDown( event ) {
        ....do stuff
        if (objectID < num_obj){
           ajax_post()
           }
        if (objectID == num_obj){ 
            $("form").submit();}
        objectID ++;
        $("form").clearForm();
        document.forms[0].ObjectID.value = objectID;
        }
  </script>
  <form action="" method="post" id="inputform">
      <div id="ajaxwrapper">
       {% csrf_token %}
       <table>
        {{ form.as_table }}
       </table>
     </div>
  </form>
</body>
</html>

私のview.py:

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import *
from firstapp.forms import PracForm3

num_obj=2

def index(request):
   Obj.objects.all().delete()
   if request.method == 'POST':
    form = PracForm3(request.POST)
    print "\n\n\n\n\n"
    if request.is_ajax():
      print "yaaaaay AJAX"
      print request.POST
    else:
      print "noooooo"
    print "\n\n\n\n\n"
    if form.is_valid():
      cd = form.cleaned_data
      .....
      if cd['ObjectID'] == num_obj:
        return HttpResponseRedirect('/submit')
   else:
     form = PracForm3()
     dic = {'form': form, 'num_obj': num_obj, ...}
   return render_to_response('index.html', dic, context_instance=RequestContext(request))  

私のurls.py:

from django.conf.urls import patterns, include, url
from firstapp.views import index, submit
from django.conf import settings

urlpatterns = patterns('',
('^index$', index),
('^submit$', submit),
)

なんらかの理由で、私の Ajax が機能しません。

4

5 に答える 5

3

これはおそらく AJAX 投稿の CSRF に関連しています。すべての POST 要求で CSRF トークンを POST データとして渡すことを忘れないでください。このコードをここに追加する必要がある場合があります。これは、Django + CSRF + AJAX について説明している Django ドキュメントです。

Djangoビューで、「送信」にリダイレクトしていることに気付きました。通常、ajaxを使用すると、別のURLにリダイレクトせず、HttpResponseを使用して、JSONなどの文字列値を返します。また、デバッガーでそのビューに飛び込んでいない限り、ビューに print ステートメントがある理由もわかりません。テスト/デバッグには、文字列を割り当てる変数が必要であり、それを ajax に戻します。次に、ajax で、このようなビューからメッセージを読み取ることができます。

def index(request):
    ...
    if request.is_ajax():
        msg = 'it worked'
    else:
        msg = 'i am sad'
    return HttpResponse(msg)
    ...

また、JavaScript は ajax 呼び出しで成功とエラーの関数を持つ必要があります。JavaScript が次のように見えるように少しビューを指定すると、成功するだけなので、エラーをキャッチしません。

...
success: function(data){alert(data)}, 

error: function(data){alert(data)}
...         

いくつかの問題が発生している可能性があるようです。リンクを提供したCSRFをまだ行っていない場合、それも問題です。テストのために、望ましい方法で対処したくない場合はcsrf_exemptを使用してください。上記のコードを試して、それがあなたのために進歩するかどうか見てください.

于 2012-12-03T07:02:40.240 に答える
0

csrf が原因である可能性が@csrf_exemptあります。メソッド名の前に追加すると役立ちます。

@csrf_exempt
def method(args):
    pass
于 2012-12-03T07:11:39.430 に答える
0

/index/ajax 呼び出しで要求していますが、パターンが一致し/indexます。

于 2012-12-03T04:50:31.137 に答える
0

CSRF をコメントアウトしたので、私の ajax 関数が問題ではありませんでした。正しい方法は次のとおりです。

function ajax_post(){ 
    $.ajax({ 
        type: 'POST',
        url: '/index/',
        data: $(this).serialize(),
        success: function(data){alert(data)}

     }); // end new Ajax.Request
}

ご意見ありがとうございます

于 2012-12-04T06:05:35.430 に答える