8

当我执行 POST 表单时,Django 1.2 一直给我这个 CSRF 验证错误。我“认为”我已经完成了 Django 1.2 文档中要求的所有事情,即,

  1. 确保 MIDDLEWARE_CLASSES 包含在“django.middleware.csrf.CsrfViewMiddleware”中

  2. 确保 {% csrf_token %}

    <form action="/words/new/" method="post">
    {% csrf_token %}
    {{ form.as_p }}
        <input type="submit" value="Enter" />
    </form>
    
  3. 在我的回复中使用 RequestContext

    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 装饰器,但似乎也没有用。我没有想法,我即将用我的笔记本电脑窒息自己。

大家有什么能想到的吗?

谢谢!

4

1 回答 1

7

你没有关注#3。RequestContext必须与显示表单的模板的呈现一起使用。感谢页面不需要。

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

作为旁注,您应该使用PRG 模式而不是直接呈现感谢页面。

于 2011-01-23T17:09:11.923 回答