表单提交时出现Django CSRF错误

时间:2013-07-15 20:37:50

标签: python django

我正在写一个Django应用程序。这是我的代码:

edit.module.html (模板;删除额外的html标记):

<h1>Enter the HTML below</h1>
<form action="./update/" method="post">
    {% csrf_token %}
    <textarea cols='55' rows='15'></textarea>
    <input type='submit' value='Submit' />
</form>

urls.py

url(r'^myapp/update/$', 'myproj.myapp.views.update_module'),

view.py

from django.http import HttpResponse
from django.shortcuts import render_to_response, get_object_or_404
from django.core.context_processors import csrf
from django.template import RequestContext

#Select the module you want to edit
def edit_modules(request):
    lpconf = {"module_to_edit" : "top"}
    return render_to_response('admin/edit.module.html', lpconf, context_instance=RequestContext(request))

def update_module(request):
    return render_to_response('admin/updated.html', context_instance=RequestContext(request))

当我提交表单时,我收到CSRF错误:“CSRF验证失败。请求中止。”

我遵循了Django文档(https://docs.djangoproject.com/en/dev/ref/contrib/csrf/)并尝试解决问题,但我做不到。我在这里做错了什么?

感谢。

更新:更新了view.py函数edit_modules和update_modules。 edit_modules是呈现表单的那个,update_modules是处理它的那个。现在,我没有收到CSRF错误。我现在收到错误:空模块名称

更新:我能够解决它。我使用一个视图来渲染表单,另一个用来处理它。我不得不在渲染表单的第一个视图中添加上下文。

2 个答案:

答案 0 :(得分:3)

您的RequestContext视图中需要update_module,而不是普通的HttpResponse。如果您使用方便的render shortcut,它将自动添加。在Django教程中有一个很好的快速介绍; A shortcut: render()

答案 1 :(得分:0)

您可以在settings.py

中启用请求上下文流程
TEMPLATE_CONTEXT_PROCESSORS = (...
    "django.core.context_processors.request")

所以你不必这样做:

return render_to_response('my_template.html',
                      my_data_dictionary,
                      context_instance=RequestContext(request)

相反,简单地说:     return render_to_response('my_template.html',                           my_data_dictionary)

另外,请确保在settings.py中的MIDDLEWARE_CLASSES中启用了“django.middleware.csrf.CsrfViewMiddleware”