Django – CSRFvalidation失败

试图通过教程制作一个简单的表单时,我收到CSRFvalidation失败的消息。 我对CSRFvalidation的实际内容做了一点研究,据我所知,为了使用它,你需要在你的html中有一个csrf_token标记,但是我没有

这是我的模板:

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

相当简单,位于contact.html

这里是我的urlconf:从django.conf.urls.defaultsimport*

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

应用程序名称是testapp1。 当我input我的url(http:// localhost:8000 / testapp1 / contact)时,我正确地转到表单。 然后当我提交表单时,我得到validation错误。

这是我的看法,虽然我不认为它是相关的:

 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 = ['info@example.com'] 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, }) 

1 。 在模板中的表单标签中包含{% csrf_token %}

2 。 在render_to_response中使用RequestContext

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

[更新]

现在,我使用render而不是render_to_response (相同的效果,less打字):

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

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 %} 

对于Django 1.4

settings.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>