使用django FormWizard步骤数据作为下一步

时间:2015-06-01 14:59:42

标签: python django django-formwizard

我有一个Django SessionWizardView,在第一步,收集一个人的详细信息,然后提供一个选项来添加与此人相关的其他人的详细信息。

如果选择该选项,我希望能够使用输入的信息作为下一步的初始数据。我最初设置初始数据的尝试看起来像这样;

def get_form_initial(self, step, **kwargs):
    initial = self.initial_dict.get(step, {})
    current_step = self.storage.current_step

    if int(current_step) > 0 or int(step) > 0:
        data = self.get_cleaned_data_for_step('0')
        initial.update(data)

    return initial

但这似乎不一致&导致一些递归调用。所以我试图将初始步骤的数据设置为类的属性,以便使用它;

class SignupWizard(SessionWizardView):
    template_name = 'wizard_form.html'
    form_list = form_list
    condition_dict = cond_dict
    model = Entrant

    def get_form_initial(self, step, **kwargs):
        initial = self.initial_dict.get(step, {})
        try:
            current_step = int(self.storage.current_step)
        except TypeError:
            current_step = None

        if current_step > 0 and int(step) > 0:
            try:
                initial.update(self.main_entrant_data)
            except AttributeError:
                pass

        return initial

    def process_step(self, form):
        data = self.get_form_step_data(form)
        if isinstance(form, MainEntrantForm):
            self.main_entrant_data = data
        return data

但是这里返回的数据包括字典键中的步骤,所以要使用它,你需要修改所有的dict键; <QueryDict: {u'0-last_name': [u'blah'], u'0-title': [u'MR'], u'submit': [u''], u'0-dob_year': [u'1984'], ... }>。所以我写了一个添加来修改键,但值似乎最终在列表中;

def get_form_initial(self, step, **kwargs):
    initial = self.initial_dict.get(step, {})
    try:
        current_step = int(self.storage.current_step)
    except TypeError:
        current_step = None

    if current_step > 0 and int(step) > 0:
        try:
            step_data = self.main_entrant_data.copy()
            for k, v in step_data.iteritems():
                new_key = re.sub(u'0-', u'', k)
                step_data[new_key] = step_data.pop(k)
                step_data[new_key] = v
            initial.update(step_data)
            print step_data
        except AttributeError, e:
            print e

    return initial

step_data等于<QueryDict: {u'last_name': [u'Walker'], u'house': [u'12'], ...

如果我遗漏该行step_data[new_key] = v,那么这些值都是列表类型; <QueryDict: {u'last_name': [[[u'Walker']]], u'house': [[u'12']], ...

1 个答案:

答案 0 :(得分:0)

我目前从第一个表单收集这些数据的决议是创建我自己的字典,而不是使用form.data;

def process_step(self, form):
    data = self.get_form_step_data(form)
    if isinstance(form, FreeCycleEntrantForm):
        entrant_data = dict()
        for k, v in data.iteritems():
            entrant_data[k] = v
        self.main_entrant_data = entrant_data
    return data