2011-01-23 23 views
8

POSTフォームを実行すると、Django 1.2は一貫して私にこのCSRF検証エラーを与えています。私は{%を確認してくださいつまり、Django 1.2.4 CSRFの確認に失敗しました

  1. はMIDDLEWARE_CLASSESが 'django.middleware.csrf.CsrfViewMiddleware'

  2. に同梱されていることを確認し、私はDjangoの1.2ドキュメントに尋ねたすべてのことをやった "と思います"私の応答%}

    <form action="/words/new/" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
        <input type="submit" value="Enter" /> 
    </form> 
    
  3. 使用RequestContextのcsrf_token

    def create(request): 
        if request.method == 'POST': 
         form = DefinitionForm(request.POST) 
         if form.is_valid(): 
          form.save() 
         c = {} 
         return render_to_response('dict/thanks.html',c, 
                context_instance=RequestContext(request)) 
        else: 
         form = DefinitionForm() 
        return render_to_response('dict/create_definition.html', { 
         'form' : form, 
        }) 
    

GETアクションがこの関数で機能することに注意してください。だから私はrender_to_responseの権利を使用していると思う。

私は@csrf_protectデコレータを投げ込もうとしても、うまく動作していないようです。私はアイデアがなく、私は自分のラップトップで自分自身を窒息させようとしています。

あなたは誰もが考えることができますか?

ありがとうございます!

+0

ブラウザのHTMLをチェックして、csrfトークンフィールドがあることを確認してください。その後、POSTレスポンスをダンプして、ビューに戻ることを確認します。 – Spacedman

答えて

7

あなたは#3をフォローしていません。 RequestContextは、フォームを表示するテンプレートのレンダリングで使用する必要があります。感謝のページには必要ありません。

return render_to_response('dict/create_definition.html', { 
    'form' : form, 
}, context_instance=RequestContext(request)) 

そして、サイドノートとして、あなたは直接感謝のページをレンダリングするのではなく、PRG patternを使用する必要があります。

+0

これはGETアクションのためのものです。コードをもう一度見てみると、request.method == 'POST'のときの条件に含めることにしました。 – Bryan

+3

@bryli:まさにそれが問題です。 CSRFコンテキストプロセッサは、トークンを作成し、それをテンプレートコンテキストに入れるときにリクエストコンテキストを必要とします(おそらく、POSTでそれをチェックするときではない)。 – AndiDog

+0

私は助けてくれました、ありがとう! – Chris

関連する問題