我有一个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']], ...
答案 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