2010-12-28 23 views
20

チュートリアルから簡単なフォームを作成しようとすると、CSRF検証に失敗しましたというメッセージが表示されます。Django - CSRF検証に失敗しました

:私は、私の知る限り、あなたは、HTMLのものcsrf_tokenのタグのいずれかが必要ですが、私は

はここに私のテンプレートだと持っていない、それを使用するために、実際にどのようなCSRFの検証に少し研究をした、とcontact.html

に位置

<form action="/testapp1/contact/" method="post"> 
    {{ form.as_p }} 
    <input type="submit" value="Submit" /> 
</form> 

かなり簡単には、ここに私のURLconfです:django.conf.urls.defaultsから はインポート*

urlpatterns=patterns('testapp1.views', 
    (r'^$', 'index'), 
    (r'^contact/$','contact') 
) 

アプリケーション名はtestapp1です。 URL(http:// localhost:8000/testapp1/contact)を入力すると、フォームに正しく行きます。私がフォームを提出すると、検証エラーが出ます。

def contact(request): 
    if request.method == 'POST': # If the form has been submitted... 
     form = ContactForm(request.POST) # A form bound to the POST data 
     if form.is_valid(): # All validation rules pass 
      subject = form.cleaned_data['subject'] 
      message = form.cleaned_data['message'] 
      sender = form.cleaned_data['sender'] 
      cc_myself = form.cleaned_data['cc_myself'] 
      recipients = ['[email protected]'] 
      if cc_myself: 
       recipients.append(sender) 
      print 'Sending Mail:'+subject+','+message+','+sender+','+recipients 
      return HttpResponseRedirect('/thanks/') # Redirect after POST 
    else: 
     form = ContactForm() # An unbound form 

    return render_to_response('contact.html', { 
     'form': form, 
    }) 

答えて

30

:私はそれは、関連はないと思うが、ここで

が私の見解です。 {% csrf_token %}テンプレート内にフォームタグが含まれています。

。ジャンゴ1.4

設定について

return render(request, 'contact.html', {form: form}) 
+0

雅私はちょうどgotteを持っていましたそれをするために働くことはできません。 CSRFの保護はオプションであると私は思った。あなたがCSRFを使用する必要があるフォームを提出した場合は、明らかに効力を発揮しません。しかたがない。ありがとう – JPC

+2

@ JPC:あなたの設定によります。 'csrf_excempt'デコレータを使用しない限り、CSRFミドルウェアを使用するのであれば必須です。あなたが 'csrf_protect'デコレータを使わないかぎり、それを使用しない場合は不要です。 – Wolph

+1

あなたはまた、 'django.templateからimport import RequestContext'する必要があります – northben

2

:今日、私はrender代わりにrender_to_response(以下タイピングと同じ効果)を使用し、[更新]

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

render_to_responseにRequestContextのを使用します。 py

MIDDLEWARE_CLASSES = (
... 
'django.middleware.csrf.CsrfViewMiddleware', 
) 

view.py

from django.template.defaulttags import csrf_token 
from django.shortcuts import render 

@csrf_token 
def home(request): 
    """home page""" 
    return render(request, 
     'template.html', 
      {} 
    ) 

template.html

<form action=""> 
    {% csrf_token %} 
.... 
</form> 
3

views.py:

from django.shortcuts import render_to_response 
from django.template import RequestContext 

def my_view(request): 
    return render_to_response('mytemplate.html', context_instance=RequestContext(request)) 

mytemlate.html:

<form action="/someurls/" method="POST">{% csrf_token %}