我目前已经实现了一个来自formtools的SessionWizardView包。
class DataframeFormView(SessionWizardView):
def done(self,form_list):
params={}
for form in form_list:
params.update(form.cleaned_data)
return HttpResponseRedirect(reverse('download',kwargs={'params':params}))
表单视图中的一切都很好,当表单成功填充时,上面提到的函数就会运行,但我需要将params参数传递给另一个视图:
from django_downloadview import VirtualDownloadView, VirtualFile
class DataframeDownloadView(VirtualDownloadView):
def get_file(self):
### Access params dictionary here!!!!
return VirtualFile(tfile.name, name=tfile.name)
我尝试过的东西:
1( 覆盖__init__
以添加self.params = kwargs.pop('params')
2( 创建使用return self.kwargs['params']
访问kwargs特定密钥参数的方法
3( Mixin解决方案(可能实现得很糟糕,但我认为这两个CBV中存在限制(
最终,通过使用方法1和2,我通过反转到download/url/,只访问了params字典的字符串表示。我需要一个更具程序性的解决方案来获得原始dict对象。TLDR:如何在视图之间传递复杂的对象。
致问候,
正如kungpu所建议的,在视图之间共享复杂对象的最佳方式可能是使用视图会话。为了将来参考,我最终做了以下工作:
def done(self,form_list,**kwargs):
params={}
for form in form_list:
params.update(form.cleaned_data)
self.request.session['params']=params
return HttpResponseRedirect(reverse(self.download_url_name))
我还将会话序列化程序更改为pickle。