我无法在Django中看到模板中的帖子数据。
来自Django的错误消息是:
“CSRF验证失败。请求已中止。”
这是我的代码:
提交表单:
<form action="/submitted/" method="post">
{% csrf_token %}
*.... User input some data ....*
</form>
结果页面(test.html):
<body>
{{ passed_dict }}
</body>
view.py
from django.core.context_processors import csrf
from django.template import RequestContext
def submitted(request):
passed_dict = {}
if request.method == 'POST':
passed_dict.update(csrf(request))
''' get the data from post and do things '''
else:
passed_dict['result'] = 'this_is_result'
## no matter what thing did, back to the original page.
return render(request, 'group_detail.html', passed_dict)
我按照Django网站上的设置指南进行操作,但仍然无效。
我错过了什么吗?
答案 0 :(得分:0)
你需要传回上下文,比如。 (https://docs.djangoproject.com/en/dev/ref/templates/api/#subclassing-context-requestcontext)
return render_to_response('my_template.html',
passed_dict,
context_instance=RequestContext(request))
答案 1 :(得分:0)
无需查看POST数据。问题很明显:您没有在首先生成表单的视图中传递CSRF令牌。如果它不在生成的表单中,它将不在POST数据中。
Django中的常用模式是使用相同的视图来生成表单并处理POST,但您似乎已将它们拆分。您需要在两个视图中传递令牌。请注意,通常的方法是使用RequestContext(或render
快捷方式),而不是手动将其添加到上下文中。
编辑确定,所以第三次,问题出现在GET上呈现表单的步骤 - 其中您没有传递CSRF令牌。同样,正如我上面所说,你不应该手动添加它,而是使用render
快捷方式来确保上下文处理器运行:render(request, 'group_detail.html', passed_dict)
。