我遇到了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))
当我使用上述内容时,我会在用户提交表单时收到以下错误。
例外值:全局名称'请求'未定义
有谁能告诉我我做错了什么?
答案 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],
}