2012-10-05 13 views
5
$.ajax({ 
    url:'/', 
    type: "POST", 
    data: {name: 'name', age: 'age'}, 
    success:function(response){}, 
    complete:function(){}, 
    error:function (xhr, textStatus, thrownError){} 
}); 

そしてviews.py中:ジャンゴjQueryのポスト要求

class SomeView(generic_views.TemplateView): 
    template_name = 'something.html' 

    def get(self, request, *args, **kwargs): 
     ...something... 
     return self.render_to_response(context) 

    def post(self, request, *args, **kwargs): 
     name = request.POST['name'] 
     age = request.POST['age'] 
     ...something... 

と私を取得:[05 /月/ 2012 12時03分58秒] "POST /何か/ HTTP/1.1" 403 2294

このデータ(名前と年齢)をjQuery経由で "SomeView"のこのポスト関数に送信したいと思います。これは、読み込まれたテンプレートと同じビューです。要求の種類が異なるだけです。 get()でテンプレートが読み込まれ、postにpost()関数が呼び出されます。出来ますか?私は他の質問をチェックして、この解決策を得ました。それは働いていたはずだった。私は間違って何をしていますか?

答えて

8

あなたは間違って何をしているか、あなたの質問への答えは、さ: あまりない!

Djangoは、受信POST要求が失敗した場合に403応答(禁止)を返します。 あなたはjQueryのajaxSetupを通じてこれを行うことができ、コードスニペットは、これがGET要求に作業を行うことhere

理由が発見され、そのGET要求はCSRFミドルウェアによってチェックされないだけです。

ここにフォームを作成しているようだが、考慮すべき別のものはクラスベースのフォームを使用することだ。彼らは取得/投稿とあなたのためのパラメータ検証を処理します。非常にきれい。特に、モデルインスタンスを編集/作成/削除するフォームを作成している場合は、ModelFormsとCreateViewsの威力を利用できます。非常にきれい。

一般的なクラスベースのビューのハングアップを取得するには、時間がかかる場合があります。しかし、それはそれに値するものです。あなたがこれを追加することができますDjangoテンプレート内

+0

ありがとうございます。しかし、この場合私は(長い話)できません。 :) これは問題なく動作しますが、端末で表示されます [05/Oct/2012 15:08:11] "POST/something/HTTP/1.1" 500 9499 – premik91

+0

500は単なるサーバーエラーです。これは、postメソッドのpythonエラーが原因である可能性があります。 –

+0

しかし、それは私がデバッグモードになってから表示されるはずですね。 – premik91

6

ajaxコールにCSRF(クロスサイトリクエスト偽造)トークンを含める必要があります。これはよくここに文書化されている:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

か、あなたはクイックフィックスを使用したい場合は、あなたのビューの@csrf_exemptデコレータを使用します。

from django.views.decorators.csrf import csrf_exempt 

@csrf_exempt 
def my_view(request): 
    ... 
+0

は私がFormViewコントロールを使用しています他のサイトでうん、あなたに男:) – premik91

2

...あなたのページのHTMLに、このような出力が何か意志

{% csrf_token %} 

...

<input type="hidden" name="csrfmiddlewaretoken" value="ckhUdNOTj88A...hfTnREALlks2kz"> 

その後、あなたは、単にこれを見つけることができますJavascriptを使用して入力してその値を取得します - この非jQueryの例のようなもの...

var el = document.getElementsByName("csrfmiddlewaretoken"); 
csrf_value = el[0].getAttribute("value"); 

最後にcを追加しますそのようなあなたのjQueryのAJAXポストフォームデータラインにsrf_valueは...

data: {name: 'name', age: 'age', csrfmiddlewaretoken: csrf_value}, 

ここで働いてjsFiddleコンセプトです:https://jsfiddle.net/vdx1Lfpc/18/

関連する問題