表单数据不会传递给Django中的视图

时间:2014-03-03 04:37:19

标签: python django

我无法在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网站上的设置指南进行操作,但仍然无效。

我错过了什么吗?

2 个答案:

答案 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)