2016-05-04 13 views
3

私はこれらの回答を使用して私の問題のために実行可能な解決策を導くことができなかった前に、djangoで動的フォームでcsrfトークンエラーが発生しました

私はフォームAと多くのチェックボックスを持つページを持っています。フォームと関連するチェックボックスは、Djangoテンプレートを通して作成されます。私は、Djangoテンプレートによって作成されたフォームAの入力値からjavascriptを介して新しいフォームBを作成しました。 Djangoはcsrf_tokenエラーのために私の新しいフォームBを受け入れていません。 djangoによってレンダリングされたフォームAからcsrfトークンを抽出し、それを動的に作成されたjavascriptフォームのcsrfトークンとして使用する方法を示すことができますか?

+0

生成されたフォーム「b」から収集したデータを投稿しますか? o 'a'のアクションを作成するので、djangoはそれを' a'という形だと考えますか? – fips

+0

いいえ、私はまったく新しいフォームを作成しており、古いフォームはすべて無視しています。 –

+0

OKですので、すべての入力フィールドとは別に、csrfトークンの隠しフィールドを投稿する前に新しいフォームに追加できますか? – fips

答えて

1

もっと簡単なアプローチは、クッキーを使用することだと思います。 csrfトークンは値を取得できるクッキーです。親切に、Ajaxのセクションを見て、それが何か助けを提供できるかどうかを確認してくださいhttps://docs.djangoproject.com/en/1.9/ref/csrf/#ajax。 javascriptのクッキーのライブラリを使用すると、理想的にCSRFトークンを取得するためにあなたを助ける必要があることを行う

var csrftoken = Cookies.get('csrftoken');

+0

どのようにあなたは動的に生成されたフォームにクッキーを追加して、そのジャンゴはそれを受け入れますか? –

+0

@Jack_of_All_Tradesフォームを生成したら、それをajax POSTリクエストまたは通常のフォームsubmitとして投稿しますか? – peckuliarYak

+0

これを解決するためのネイティブjsがありますか?私はできるだけ余分なjsライブラリを避けたい。 –

3

投稿するデータにcsrfトークンを含めることができます。

あなたは、HTMLフォームで隠しフィールドからそれを抽出することができ、次のいずれか

var token = $('input[name="csrfmiddlewaretoken"]').val(); 

それとも、無地のjsを好む場合、あなたが言及したように、あなたが使用することができますjQueryのセレクタを使用して

<input type="hidden" name="csrfmiddlewaretoken" value="IxwFarTrerVBZbVDX0elVHUEbh0YH58j"> 

function getCookie(name) { 
    var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 
    return v ? v[2] : null; 
} 

var token = getCookie('csrftoken'); 
関連する問題