8
$.ajax({
    url:'/',
    type: "POST",
    data: {name: 'name', age: 'age'},
    success:function(response){},
    complete:function(){},
    error:function (xhr, textStatus, thrownError){}
});

そしてviews.pyで:

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 / Oct / 2012 12:03:58] "POST / something / HTTP / 1.1" 403 2294

このデータ(名前と年齢)をjQuery経由で「SomeView」のこの投稿関数に送信したいと思います。これはロードされたテンプレートと同じビューですが、リクエストタイプが異なるだけです。get()でテンプレートがロードされ、postでpost()関数が呼び出される必要があります。出来ますか?私は他の質問をチェックして、この解決策を得ました。それは機能しているはずでした。私は何が間違っているのですか?

4

4 に答える 4

12

あなたが間違っていることについてのあなたの質問への答えは、次のとおりです。

着信POSTリクエストがCsrfチェックに失敗した場合、Djangoは403応答(禁止)を返します。これはjQueryのajaxSetupを介して行うことができます。コードスニペットはここにあります

これがGETリクエストで機能する理由は、GETリクエストがcsrfミドルウェアによってチェックされないためです。

ここでフォームを作成しているように見えるので、考慮すべきもう1つのことは、クラスベースのフォームを使用することです。それらはget/postとパラメータ検証も処理します。とてもきれい。特に、モデルインスタンスを編集/作成/削除するフォームを作成する場合は、ModelFormsとCreateViewsの機能を利用できます。とてもきれい。

これらのジェネリッククラスベースのビューのコツをつかむには時間がかかる場合があります。しかし、それは非常に価値があります。

于 2012-10-05T10:24:27.763 に答える
9

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):
   ...
于 2012-10-05T10:22:40.043 に答える
4

Djangoテンプレート内でこれを追加できます...

{% csrf_token %}

これはあなたのページのhtmlにこのようなものを出力します...

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

次に、Javascriptを使用して、この入力を見つけてその値を取得できます-この非jQueryの例のようなもの...

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

最後に、csrf_valueをjQueryAJAXポストフォームデータ行に次のように追加します...

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

これが実用的なjsFiddleの概念です:https ://jsfiddle.net/vdx1Lfpc/18/

于 2017-06-24T04:45:08.323 に答える
1

私はあなたがこのようなことをすることができるという別の投稿を読みました:

$.ajax({
    method: "POST",
    url: "{% url 'some_route' %}",
    headers: {'X-CSRFToken': '{{ csrf_token }}'},
    contentType: "application/json",
    dataType: 'json',
    data: {name:$('#id_name').val()}
})
.fail(function(message) {
    alert('error');
})
.done(function(data) {
    alert(data);
});
于 2020-01-16T13:53:17.077 に答える