2012-12-03 9 views
5

私はAjaxとDjangoの初心者です。質問を単純化するために、私は1つの隠しフォームと2つのオブジェクトを持っていると仮定し、オブジェクトの位置の一部をクリックするようにユーザーに依頼します。各クリックは、フォームの一部を入力します。フォームごとにオブジェクトごとに一度記入したい。そのため全体的に2回。フォームが最初のサブジェクトに塗りつぶされたら、Ajax経由でフォームをサーバーに送信し、ページを更新せずに、フォームを2番目のオブジェクトに再充填することができます。しかし、何らかの理由で私はajax経由で送信されるフォームを取得できません。ここAJAXとDJANGOのフォーム

は私のコードは次のとおりです。 の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は私が間違っていることを知っている人はいませんか?

+0

問題について詳しく説明できますか?ブラウザのデベロッパーコンソール(Chromeをお勧めします)を使用して、表示されているエラーやリクエストを貼り付けることができます。 –

+0

私はエラーやリクエストを見ません。アヤックスが投稿しているかどうかわからない – user1871528

+0

あなたはCSRFを説明していますか? – esse

答えて

0

あなたのajax呼び出しで/index/を要求していますが、パターンが/indexと一致しています。

+0

私はURLを '/ index /'に変更しました: '/ index'はまだ動作していません – user1871528

3

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

"submit"にリダイレクトされていることをDjangoビューで確認します。通常、別のURLにリダイレクトしません.HttpResponseを使用してJSONなどの文字列値を返します。また、デバッガでそのビューを読んでいるのでなければ、なぜあなたのビューにprintステートメントがあるのか​​わかりません。テスト/デバッグのために、文字列を割り当てる変数を用意して、それをあなたの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を使用するのが望ましいと思わないならcsrf_exemptを使います。上記のコードビットを試して、それがあなたのために進歩するかどうかを見てください。

0

これは、csrfによって引き起こされる可能性があります。メソッド名が役立つ前に@csrf_exemptを追加してください。

@csrf_exempt 
def method(args): 
    pass 
+0

それは役に立たなかった。 – user1871528

0

私はCSRFをコメントアウトしたので、私のajax機能は問題ではありませんでした。ここでは正しい方法である:CSRFトークンが$('#input-form')ポスト要求に含まれるすべての入力

1

ため

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

    }); // end new Ajax.Request 
} 

おかげで、私はそれが問題だったとは思いません。問題は、コンテキストをjsonに変換していないということです。これは、docs exampleからです:

import json 
from django.http import HttpResponse 

class JSONResponseMixin(object): 
    """ 
    A mixin that can be used to render a JSON response. 
    """ 
    response_class = HttpResponse 

    def render_to_response(self, context, **response_kwargs): 
     """ 
     Returns a JSON response, transforming 'context' to make the payload. 
     """ 
     response_kwargs['content_type'] = 'application/json' 
     return self.response_class(
      self.convert_context_to_json(context), 
      **response_kwargs 
     ) 

    def convert_context_to_json(self, context): 
     "Convert the context dictionary into a JSON object" 
     # Note: This is *EXTREMELY* naive; in reality, you'll need 
     # to do much more complex handling to ensure that arbitrary 
     # objects -- such as Django model instances or querysets 
     # -- can be serialized as JSON. 
     return json.dumps(context) 
関連する問題