2017-02-07 6 views
0

은 마법사의 첫 번째 단계에서 수신, 나에게 어떻게 데이터를 얻을 수있는 방법을 제안하며 두 번째 단계의 형태로 사용하십시오 :장고 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 ... - 첫 번째 양식 W1_ParamForm에서 선택된 도시 ID를 포함하는 매개 변수. 문제 - 두 번째 형식으로 가져 오는 방법!

views.py 사전에

urlpatterns = [ 
... 
# Wizard start 
    url(r'^doestim$', W1_Estim.as_view([W1_ParamForm,W1_SelectForm]), name='doestim'), 
... 

많은 감사

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!

답변

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

고맙습니다.하지만 "완료되었습니다"가 너무 늦으므로 귀하의 제안은 적용되지 않습니다. 두 번째 양식이 아직 나타나지 않을 때 단계 1 단계의 데이터를 얻는 데 필요합니다. 1 단계의 데이터. – Vladimir

+0

@ user3611898을 사용하면 특정 단계를 완료 한 후에 원하는 곳에서 동일한 기능을 호출 할 수 있습니다. – Rohan

+0

나는 그것을 이해하지만 W1_SelectForm의 생성자에서 그 데이터를 어떻게받을 수 있습니까? 네가 설명해 주면 아주 고맙게 여길거야! – Vladimir

0

알았어!

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_Estim 뷰 클래스에 대한 이전의 단계에서 데이터를주고받을하기 위해, 하나 반드시

A) get_form_initial (자기 단계를 구현)에서 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) 

그게 다야!