如何在django FormWizard中获取上一步的数据

时间:2017-02-07 05:29:11

标签: python django formwizard

请向我推荐如何获取数据的方式,在向导的第一步中收到,并以第二步的形式使用它:

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'),
 ...

非常感谢提前!

2 个答案:

答案 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
        ...