【问题标题】:Can't Get CSRF Token to Appear on a Django Template/View无法让 CSRF 令牌出现在 Django 模板/视图上
【发布时间】: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


【解决方案1】:

你需要导入这个:

from django.template import RequestContext

然后像这样使用它:

def example():

    # Some code

    return render_to_response('my_example.html', {
    'Example_var':my_var
    }, context_instance=RequestContext(request))

这将强制出现{% csrf_token %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2014-08-21
    • 2021-02-14
    • 2011-07-14
    • 1970-01-01
    • 2018-04-10
    • 2013-08-11
    相关资源
    最近更新 更多