请向我推荐如何获取数据的方式,在向导的第一步中收到,并以第二步的形式使用它:
forms.py
# First step form
class W1_ParamForm(forms.Form):
cities = forms.ModelChoiceField( label = 'City',
queryset=City.objects.all().order_by('name') )
# Second step form
class W1_SelectForm(forms.Form):
oEstates = MyModelMultipleChoiceField(
queryset = RealEstate.objects.
filter(city_id__exact = ...).
order_by('priceM'),
widget = forms.CheckboxSelectMultiple,
required = False)
Herein ... - 包含城市ID的参数,以第一种形式W1_ParamForm选择。问题 - 如何以第二种形式获得它!
views.py
class W1_Estim(SessionWizardView):
template_name = "w1_estim.html"
def done(self, form_list, **kwargs):
form_data = [form.cleaned_data for form in form_list]
return render_to_response('w1_done.html', {'form_data': form_data})
urls.py
urlpatterns = [
...
# Wizard start
url(r'^doestim$', W1_Estim.as_view([W1_ParamForm,W1_SelectForm]), name='doestim'),
...
非常感谢提前!
答案 0 :(得分:2)
我明白了!为了接收上一步的数据,必须
A)为视图类W1_Estim实现get_form_initial(self,step)
def get_form_initial(self, step):
if step == '1':
# on SECOND step get data of first step
step0data = self.storage.get_step_data('0')
if step0data:
cities = step0data.get('cities', '')
return self.initial_dict.get(step, {'cities': cities})
return self.initial_dict.get(step, {})
B)实现表单类W1_SelectForm
的构造函数def __init__(self, *args, **kwargs):
c = kwargs['initial']['cities']
self.oEstates = ModelMultipleChoiceField(
queryset = RealEstate.objects.
filter(city_id = c).
order_by('priceM'),
widget = forms.CheckboxSelectMultiple,
required = False)
# NEED TO INCLUDE field oEstates into "declared_fields"!!!
self.declared_fields['oEstates']=self.oEstates
# superclass constructor ought to be called only AFTER
# including new field of class into "declared_fields" !!!
super(W1_SelectForm, self).__init__(*args, **kwargs)
多数民众赞成!
答案 1 :(得分:0)
您可以使用向导视图的get_cleaned_data_for_step()
方法。
class W1_Estim(SessionWizardView):
template_name = "w1_estim.html"
def done(self, form_list, **kwargs):
...
data_for_step1 = self.get_cleaned_data_for_step('1')
#do something with data_for_step1
...