SessionWizardView期间未存储的额外会话数据

时间:2015-07-17 13:49:32

标签: python django session

我有一个Django SessionWizardView我希望在这些步骤中为用户添加额外的数据以利用它们。基本上我想建立一个列表,以及一个完成后存储步骤信息的字典。

向导的第一步允许用户添加有关自己的信息,最后允许用户添加其他人的详细信息。如果选择此选项,则呈现另一个条件形式&我想为他们提供使用之前输入数据的选项。

因此,在process_step()方法中,我正在创建一个列表,然后为流程中的每个步骤创建相应的数据字典。最初我将这些作为类属性,但觉得它们更适合用户的会话,所以我试图像这样添加它们;

def process_step(self, form):
    form_data = self.get_form_step_data(form)
    current_step = self.storage.current_step or ''
    data_dict = self.request.session.get('data_dict', dict())
    data_list = self.request.session.get('data_list', list())

    if current_step in data_dict:
        # Always replace the existing data for a step.
        data_dict.pop(current_step)

    if not isinstance(form, TermsForm):
        entrant_data = dict()

        for k, v in form_data.iteritems():
            entrant_data[k] = v

        for k in entrant_data.iterkeys():
            new_key = re.sub('{}-'.format(current_step), u'', k)
            entrant_data[new_key] = entrant_data.pop(k)

        data_dict[current_step] = entrant_data
        done = False
        for i, data in enumerate(data_list):
            if data[0] == current_step:
                data_list[i] = (
                    current_step, u'{} {}'.format(
                        entrant_data['first_name'],
                        entrant_data['last_name']
                    )
                )
                done = True

        if not done:
            data_list.append(
                (
                    current_step, u'{} {}'.format(
                        entrant_data['first_name'],
                        entrant_data['last_name']
                    )
                )
            )

    self.request.session['data_dict'] = data_dict
    self.request.session['data_list'] = data_list
    self.request.session.modified = True

    return form_data

运行此方法后,我的新会话密钥不是会话的一部分。从我一直在阅读的内容来看,这是设置会话数据的有效方法,但我在某个地方犯了错误吗?

1 个答案:

答案 0 :(得分:0)

在我的头脑中,你的process_step函数调用错过了明确的request parm。它主要被称为:

process_step(self, request, form, step):