如何将RequestContext作为可选的第三个参数传递给render_to_response

时间:2014-10-10 11:16:11

标签: django django-forms django-views

我遇到了csrf令牌的一些问题,我认为这个问题与使用done()的SessionWizardview render_to_response方法有关,因此使用了Context实例而不是RequestContext。 From the Django Documentation

  

如果您正在使用Django的render_to_response()快捷方式来填充   模板与字典的内容,您的模板将是   默认情况下传递一个Context实例(不是RequestContext)。用一个   在模板渲染中使用RequestContext,传递可选的第三个   render_to_response()的参数:RequestContext实例。你的代码   可能看起来像这样:

def some_view(request):
    # ...
    return render_to_response('my_template.html',
                              my_data_dictionary,
                              context_instance=RequestContext(request))

显然,RequestContext始终使用django.core.context_processors.csrf来自同一文档:

  

除此之外,RequestContext始终使用   django.core.context_processors.csrf。这是与安全相关的   管理员和其他贡献应用程序所需的上下文处理器,以及   在意外错误配置的情况下,它是故意硬编码的   在TEMPLATE_CONTEXT_PROCESSORS中无法关闭   设置。

但我无法将可选的第三个参数附加/传递给我的' done()'方法

class SurveyWizardOne(SessionWizardView):                      
    def get_context_data(self, form, **kwargs):
    ....
    ....

    def done(self, form_list, **kwargs):   
        return render_to_response('Return_to_AMT.html', {
            'form_data': [form.cleaned_data for form in form_list],            
        }, context_instance=RequestContext(request))  

当我使用上述内容时,我会在用户提交表单时收到以下错误。

  

例外值:全局名称'请求'未定义

有谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:0)

这是非常基本的Python:你不能引用当前范围内不存在的对象。

幸运的是,从基类View类继承的所有基于类的视图都将请求设置为实例变量,这意味着您可以将其引用为self.request。另请注意,有一个较短的render快捷方式,它在内部使用RequestContext,并将请求作为初始参数。所以:

return render(self.request, 'Return_to_AMT.html', {
        'form_data': [form.cleaned_data for form in form_list],            
    }