2012-03-07 105 views
12

下面是HTML的模板的相关片段:Django的CSRF令牌不会显示

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

这里是我的settings.pyMIDDLEWARE_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验证失败。请求中止。

回答

21

您需要通过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) 
+0

谢谢你,这工作! – babonk 2012-03-08 03:27:26

+1

非常有帮助!我有一个自定义模板标签,所以我必须指定'@ register.simple_tag(takes_context = True)',然后'返回render_to_string('template.html',{},context_instance = context)'。 – osa 2013-12-16 05:27:19

5

虽然有检查答案,我想指出的是,写context_instance....变得非常烦人。我觉得这很有用...特别是与forms

context.update(csrf(request)) 
+0

感谢您的提示 – babonk 2012-03-08 07:07:44