2013-03-07 95 views
4

我有一個formwizard的問題。在嚮導的第3步中,我使用了一個篩選查詢,這取決於第1步和第2步中的選擇。向前移動時,我的嚮導工作正常,但當用戶按下前一個或更改第1步和第2步的選擇時,事情出錯了驗證錯誤或過濾器將不起作用)。Formwizard自定義查詢集

這裏是我的forms.py:

class BoekForm3(forms.Form): 
    Activiteit = forms.ModelChoiceField(queryset=Activiteit.objects.all(), empty_label="(Nothing)") 

如果我在嚮導的步驟3 forms.py正確的字段使用的查詢集Activiteit.objects.none()顯示正確的,但在第3步總是讓驗證錯誤。

如果我在forms.py中使用queryset Activiteit.object.all(),則前進時會在步驟3中顯示正確的(已過濾)字段,並且表單將進行驗證。然而,當用戶在步驟4中按下前一個時,過濾器消失,並且所有選擇都可用。

編輯2:確定我發現每次都讀取get_form(刪除了我之前的關於此的編輯)。我的代碼的問題是,當用戶從step4返回到step3時,get_form使用的步驟是step4。我試圖改變:

「如果步驟== '第三步'」

到:

「如果步驟== '第三步' 或步== '第四步':」 在

我的看法,但這導致在Activiteit上的關鍵錯誤

我認爲字段更新移動到第3步,但形式不是。我在下面列出了我的views.py。

class BoekingWizard(SessionWizardView): 
    def get_template_names(self): 
     return [TEMPLATES[self.steps.current]] 

    def get_context_data(self, form, **kwargs): 
     plaatjes = Activiteitsgroepen.objects.all() 
     context = super(BoekingWizard, self).get_context_data(form=form, **kwargs) 
     if self.steps.current == 'step1': 
      context.update({'plaatjes': plaatjes}) 
     return context 

    def get_form(self, step=None, data=None, files=None): 
     form = super(BoekingWizard, self).get_form(step, data, files) 
     if step == 'step3': 
      x = self.get_cleaned_data_for_step('step1') or {} 
      filter1 = x['Type_activiteit'].Groep 
      y = self.get_cleaned_data_for_step('step2') or {} 
      if y['Aantal_personen'] < 76: 
       filter2 = 'kleinere groepen' 
      elif y['Aantal_personen'] > 76: 
       filter2 = 'grotere groepen' 
      else: 
       filter2 = 'geen selectie' 
      reeks = ['1','2','3'] 
      if y['Dagdeel'] in reeks: 
       filter3 = 'Dagdeel' 
      elif y['Dagdeel'] == '4': 
       filter3 = 'Hele dag' 
      elif y['Dagdeel'] == '5': 
       filter3 = 'Middag + Avond' 
      elif y['Dagdeel'] == '6': 
       filter3 = 'Dag + Avond' 
      form.fields['Activiteit'].queryset = Activiteit.objects.filter(Soort__Groep = filter1).filter(Grootte__Naam = filter2).filter(Dag__Omschrijving = filter3) 
     return form 
+0

你應該試試這個https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects – masterofdestiny 2013-03-07 10:18:21

+0

不應該'如果step =='step3': '實際上'如果step =='3':'按照文檔? – Rohan 2013-03-07 10:41:22

+0

@羅漢好點。我爲每一步使用自定義模板,然後將步號更改爲定義模板時使用的名稱。 – 2013-03-07 11:09:49

回答

0

它看起來越來越多,Formwizard不支持我想要的。因此,我開始使用常規表單工作,並將clean_data存儲在會話中。好處是我有更多的控制權,並且我更清楚發生了什麼。這裏的想法:

def BoekingForm(request): 
    if request.method == 'POST': 
     if request.POST.get('BoekForm2'): 
      form1 = BoekForm1(request.POST) 
      if form1.is_valid(): 
       request.session['Data_BoekForm1'] = form1.cleaned_data 
       if 'Data_BoekForm2' in request.session: 
        x = request.session['Data_BoekForm2'] 
       else: 
        x = None 
       form2 = BoekForm2(initial = x) 
       return render_to_response('boeking/form2', { 
        'form2': form2, 
       }, context_instance = RequestContext(request)) 

     else: 
       return render_to_response('boeking/form1', { 
        'form1': form1, 
       }, context_instance = RequestContext(request)) 
     if request.POST.get('BoekForm3'): 
      form2 = BoekForm2(request.POST) 

,除非有人帶有一個解決方案解決內Formwizard我的問題,我會以紀念我自己的答案作爲解決方案。

+0

你可以告訴我你在做什麼從1到另一個嗎?意味着在按鈕上單擊表單調用相同的視圖? – 2013-03-21 16:56:19

+0

在模板中我有一個確認按鈕:然後這個信息在請求中。POST:如果request.POST.get('BoekForm2'): 您還可以在如下形式中包含一個字段: 2013-03-22 10:25:51

+0

我在傳遞價值方面有問題..你可以指出我的錯誤..如果我顯示你我的代碼? – 2013-03-22 12:37:32

3

要使用自定義步驟名稱,必須與步驟名稱和窗體類

FORMS = [("step1", myapp.forms.Step1Form), 
     ("step2", myapp.forms.Step2Form)] 

和urls.py的元組的列表初始化嚮導類:

urlpatterns = patterns('', 
    (r'^wizard/$', BoekingWizard.as_view(FORMS)), 
) 
+0

我知道,但這不是問題,因爲我向前邁進時嚮導正在工作。 – 2013-03-11 07:14:55