【问题标题】:Django CSRF token won't showDjango CSRF 令牌不会显示
【发布时间】:2012-03-25 12:42:05
【问题描述】:

这是模板中HTML的相关sn-p:

    <form action="/submit_text/" method="post">
    {% csrf_token %}
    {% include "backbone/form_errors.html" %}
    {{form.as_p}}
    <input type="submit" value="Submit" />
    </form>

这是我的settings.py MIDDLEWARE_CLASSES 声明:

MIDDLEWARE_CLASSES = ( 
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

CSRF 令牌根本不显示,导致

禁止 (403) CSRF 验证失败。请求中止。

【问题讨论】:

    标签: django django-templates django-csrf


    【解决方案1】:

    虽然有一个检查答案,但我想指出写context_instance.... 真的很烦人。我觉得这很有用...尤其是forms

    context.update(csrf(request))
    

    【讨论】:

      【解决方案2】:

      您需要在render_to_response 中传递RequestContext 才能真正运行上下文处理器。

       from django.template import RequestContext
      
       context = {}
       return render_to_response('my_template.html',
                                 context,
                                 context_instance=RequestContext(request))
      

      新的render 快捷方式(django 1.3+)将为您完成:

       from django.shortcuts import render
      
       context = {}
       return render(request, 'my_template.html', context)
      

      【讨论】:

      • 非常有帮助!我有一个自定义模板标签,所以我必须指定@register.simple_tag(takes_context = True),然后指定return render_to_string('template.html', {}, context_instance=context)
      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 2014-03-19
      • 2013-08-11
      • 2016-08-03
      • 2019-03-20
      • 1970-01-01
      • 2012-01-26
      • 2020-10-29
      相关资源
      最近更新 更多