【发布时间】:2014-10-16 23:49:50
【问题描述】:
我正在尝试使用 Django ListView 子类来生成一个带有表单的页面。这是一个老式的手动 HTML 表单,而不是 Django 生成的表单(尽管我在同一页面的其他地方也有一个 Django 生成的表单)。由于 Django 包含 CSRF 身份验证,因此我需要在该表单中包含 CSRF 令牌才能使其正常工作。
但是,即使在查看了几篇相关的 Stack Overflow 帖子(并相应地修复了一些问题)之后,我也没有太多运气。
基本上我在ListView 子类上有一个get 方法,并且我使用方法装饰器用CSRF 装饰器来装饰它:
class FooView(ListView):
@method_decorator(ensure_csrf_cookie)
def get(self, request):
# code for otherwise working view
在我的模板中我有:
<form>
{% csrf_token %}
但是,当我在页面呈现后查看源代码时,我只看到:
<form>
(没有 CSRF 令牌)。
我没有明确地将 CSRF 令牌添加到上下文中,因为我使用的是 ListView,并且按照 https://docs.djangoproject.com/en/1.6/ref/contrib/csrf:
如果您使用的是通用视图或贡献应用程序,那么您已经涵盖了
我确定我只是遗漏了一些基本的东西,但是任何解释可能是什么的帮助将不胜感激。
【问题讨论】:
-
您是否在设置中添加了
middleware.csrf.CsrfViewMiddleware? -
我认为您需要实际显示
get方法的代码。 -
@Andrey Zarubin 从技术上讲,我没有添加它,它已经存在了,但是是的。
-
@Daniel Roseman 当我去粘贴我的
get方法时,我意识到了问题:我使用的是render_to_response,它(我接受它)避免了ListView的内置提供CSRF 令牌显然意味着我需要自己提供它(当我这样做时,一切正常)。您能否以答案的形式发表您的评论(大意是“您的 get 方法一定有问题,例如在您应该调用超级方法时使用 render_to_response ”)然后我可以接受它并给你积分?
标签: django django-csrf