2017-02-07 8 views
0

は、ウィザードの最初のステップで受信し、私にどのようにデータを取得する方法を推奨し、第二段階の形でそれを使用してください:ジャンゴフォームウィザードで、前のステップのデータを取得する方法

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で選択されています。問題 - それを第2の形式で入手する方法!事前に

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

ウィザードビューの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 
     ... 
+0

ありがとうございますが、「済」が遅すぎるため、あなたの提案は適用されません。第2のフォームがまだ表示されていない段階で第1段階のデータを取得する必要があります。ステップ1のデータ。 – Vladimir

+0

@ user3611898では、特定の手順を完了した後で、必要な場所から同じ機能を呼び出すことができます。 – Rohan

+0

私はそれを理解していますが、W1_SelectFormのコンストラクタでそのデータをどのように受け取ることができますか?あなたが私に説明してくれれば、とても感謝しています! – Vladimir

0

私はそれを手に入れました!前のステップからのデータを受け取るために、一方が

A)ビュークラスのget_form_initial(自己、ステップ)W1_Estim

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) 

のコンストラクタを実装する実装しなければなりませんそれで全部です!

関連する問題