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>