【问题标题】:Form data doesn't be passed to view in Django表单数据不会传递给 Django 中的视图
【发布时间】:2014-04-04 00:41:29
【问题描述】:

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

我错过了什么吗?

【问题讨论】:

  • 你可以在passed_dict.update(csrf(request))之后print passed_dict。你看到了什么?
  • "CSRF 验证失败。请求中止。"

标签: python django


【解决方案1】:

您需要传回上下文,例如。 (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))

【讨论】:

  • 原因是“CSRF令牌丢失或不正确。”,我认为请求没有成功发送。
  • 你也必须传递上下文,如果你检查模板和渲染的工作,>>> from django.template import Context, Template >>> t = Template("My name is {{ person.first_name }}.") >>> d = {"person": {"first_name": "Joe", "last_name": "Johnson"}} >>> t.render(Context(d))
  • 对不起,我不明白。
  • 好的,你能评论一下这个passed_dict.update(csrf(request))然后再运行看看吗?
【解决方案2】:

无需查看 POST 数据。问题很清楚:您没有在首先生成表单的视图中传递 CSRF 令牌。如果不在生成的表单中,则不会在 POST 数据中。

Django 中的常用模式是使用相同的视图来生成表单并处理 POST,但您似乎将它们分开了。您需要在两个视图中传递令牌。请注意,执行此操作的常用方法是使用 RequestContext(或 render 快捷方式),而不是手动将其添加到上下文中。

编辑好的,第三次,问题出在在 GET 上呈现表单的步骤中 - 您没有传递 CSRF 令牌。同样,正如我上面所说,您根本不应该手动添加它,而是使用render 快捷方式来确保运行上下文处理器:render(request, 'group_detail.html', passed_dict)。

【讨论】:

  • 在 Django 中使用通常的模式。我在我的表单中设置了action="",并在我的视图中写下if request.method == 'POST',以生成表单。但它仍然不起作用。是否需要使用 Django 的表单?或者我可以使用正常的方式生成表单?
  • 正如我所说,问题不在于 POST 步骤。请显示完整视图(编辑您的问题)。
  • 说真的,在您发布实际的真实视图之前,我无法为您提供帮助。该代码中的 CSRF 应该来自哪里?是在passed_dict 吗?我怎么知道?发布完整代码。
  • 这几乎是完整的代码,其余代码只是调用其他模块/类。我不确定是否清楚。
  • 另一个错误是d doesn't look like a module path,它是在生成表单页面时在module_loading.py引起的。
猜你喜欢
  • 2017-08-31
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2012-05-17
  • 2017-12-13
  • 2020-07-27
相关资源
最近更新 更多