在Django中基于类的视图之间以args / kwargs形式传递的复杂对象

时间:2018-11-08 03:27:28

标签: python django django-formtools

我目前有一个来自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:如何在视图之间传递复杂的对象。

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

如kungphu所建议,在视图之间共享复杂对象的最佳方法可能是使用视图会话。 为了将来参考,我最终做了以下工作:

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。